web-dev-qa-db-ja.com

POST JSONのRestTemplateを介したリクエスト

問題を解決する方法の例を見つけられなかったので、助けを求めたいと思います。 JSONのRestTemplateオブジェクトを使用してPOSTリクエストを送信することはできません

私が得るたびに:

org.springframework.web.client.HttpClientErrorException:415 Unsupported Media Type

この方法でRestTemplateを使用します。

...
restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
list.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(list);
...
Payment payment= new Payment("Aa4bhs");
Payment res = restTemplate.postForObject("http://localhost:8080/aurest/rest/payment", payment, Payment.class);

私のせいは何ですか?

109
Johnny B

このテクニックは私のために働いた:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);

これが役立つことを願っています

143
kanu dialani

RESTエンドポイントをデバッグしようとしたときに、この問題に遭遇しました。以下は、SpringのRestTemplateクラスを使用して、私が使用したPOSTリクエストを作成する基本的な例です。動作するバージョンを取得するために、さまざまな場所からコードをつなぎ合わせるのにかなり長い時間がかかりました。

RestTemplate restTemplate = new RestTemplate();

String url = "endpoint url";
String requestJson = "{\"queriedQuestion\":\"Is there pain in your hand?\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
String answer = restTemplate.postForObject(url, entity, String.class);
System.out.println(answer);

残りのエンドポイントの特定のJSONパーサーは、フィールド名の周りに必要な二重引用符を使用していたため、requestJson文字列で二重引用符をエスケープしました。

86
Morgan Kenyon

私は次のようにJSONObjectsでrestテンプレートを使用しています:

// create request body
JSONObject request = new JSONObject();
request.put("username", name);
request.put("password", password);

// set headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers);

// send request and parse result
ResponseEntity<String> loginResponse = restTemplate
  .exchange(urlString, HttpMethod.POST, entity, String.class);
if (loginResponse.getStatusCode() == HttpStatus.OK) {
  JSONObject userJson = new JSONObject(loginResponse.getBody());
} else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) {
  // nono... bad credentials
}
68
Mikael Lepistö

指定通り heremessageConverterMappingJacksonHttpMessageConverterを追加する必要があると思います

13
Raghuram

Spring 3.0を使用している場合、org.springframework.web.client.HttpClientErrorException:415 Unsupported Media Type例外を回避する簡単な方法は、jackson jarファイルをクラスパス、およびmvc:annotation-driven config要素を使用します。 ここで指定

MappingJacksonHttpMessageConverterの特別な設定なしで mvc-ajax アプリが動作する理由を理解しようとして、髪を引っ張っていました。上記のリンクを密接にリンクした記事を読む場合:

カバーの下で、Spring MVCはHttpMessageConverterに委任してシリアル化を実行します。この場合、Spring MVCはJackson JSONプロセッサー上に構築されたMappingJacksonHttpMessageConverterを呼び出します。この実装は、クラスパスにJacksonが存在する状態でmvc:annotation-driven構成要素を使用すると自動的に有効になります。

8
Mike G

「415 Unsupported Media Type」エラーは、サーバーがPOSTリクエストを受け入れないことを示しています。リクエストは絶対に問題ありません。設定が間違っているのはサーバーです。

MappingJacksonHttpMessageConverterは、リクエストのコンテンツタイプヘッダーをapplication/jsonに自動的に設定しますが、サーバーがそれを拒否していると思います。ただし、サーバーのセットアップについては何も教えていないので、そのことについて本当にアドバイスすることはできません。

6
skaffman

私はこのようにしていて、うまくいきます。

HttpHeaders headers = createHttpHeaders(map);
public HttpHeaders createHttpHeaders(Map<String, String> map)
{   
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    for (Entry<String, String> entry : map.entrySet()) {
        headers.add(entry.getKey(),entry.getValue());
    }
    return headers;
}

//ここにヘッダーを渡します

 String requestJson = "{ // Construct your JSON here }";
logger.info("Request JSON ="+requestJson);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logger.info("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
logger.info("Response ="+response.getBody());

お役に立てれば

5
Yakhoob

この問題が発生していましたが、クライアントではSpringのRestTemplateを使用し、サーバーではSpring Webを使用しています。両方のAPIのエラー報告は非常に乏しく、開発が非常に困難です。

あらゆる種類の実験を何時間も試してみたところ、予想されるリストの代わりにPOST本文のnull参照を渡すことで問題が発生していることがわかりました。 RestTemplateはnullオブジェクトからcontent-typeを決定できないが、それについて文句を言っていないと思います。正しいヘッダーを追加した後、サービスメソッドを入力する前に、Springで別のサーバー側例外を取得し始めました。

修正は、nullの代わりにクライアントから空のリストを渡すことでした。 null以外のオブジェクトにはデフォルトのcontent-typeが使用されるため、ヘッダーは不要です。

4
Alex Worden

このコードは私のために働いています。

RestTemplate restTemplate = new RestTemplate();
Payment payment = new Payment("Aa4bhs");
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("payment", payment);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(map, headerObject);

Payment res = restTemplate.postForObject(url, httpEntity, Payment.class);
3
Ganesh

応答を処理したくない場合

private RestTemplate restTemplate = new RestTemplate();
restTemplate.postForObject(serviceURL, request, Void.class);

プロセスへの対応が必要な場合

String result = restTemplate.postForObject(url, entity, String.class);
2

私にとっては、このセットアップでエラーが発生しました:

AndroidAnnotationsSpring Android RestTemplate Moduleおよび...

GsonHttpMessageConverter

Androidアノテーションには、パラメーターなしでPOSTリクエストを生成するために変換されたいくつかの問題があります。単にパラメーターnew Object()で解決しました。

0

なぜあなたが必要以上に一生懸命働くのですか? postForEntityは、単純なMapオブジェクトを入力として受け入れます。以下は、Springで特定のRESTエンドポイントのテストを書いているときにうまく機能します。 SpringでJSON POSTリクエストを作成する最も簡単な方法だと思います。

@Test
public void shouldLoginSuccessfully() {
  // 'restTemplate' below has been @Autowired prior to this
  Map map = new HashMap<String, String>();
  map.put("username", "bob123");
  map.put("password", "myP@ssw0rd");
  ResponseEntity<Void> resp = restTemplate.postForEntity(
      "http://localhost:8000/login",
      map,
      Void.class);
  assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
}
0
eriegz