Spring restTemplateの使用に問題があります。
とりあえず私は休憩サービスのPUTリクエストを送信しています。休憩サービスは重要な情報を返信します。
問題はrestTemplate.putがvoidメソッドであり、stringその応答を見ることができません。
いくつかの回答に従って、私は自分のメソッドを変更し、現在restTemplate.exchangeを使用しています。これが私のメソッドです。
public String confirmAppointment(String clientMail, String appId)
{
String myJsonString = doLogin();
Response r = new Gson().fromJson(myJsonString, Response.class);
// MultiValueMap<String, String> map;
// map = new LinkedMultiValueMap<String, String>();
// JSONObject json;
// json = new JSONObject();
// json.put("status","1");
// map.add("data",json.toString());
String url = getApiUrl() + "company/" + getCompanyId() + "/appointment/" + appId + "?session_token=" + r.data.session_token;
String jsonp = "{\"data\":[{\"status\":\"1\"}]}";
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("Accept", "*/*");
HttpEntity<String> requestEntity = new HttpEntity<String>(jsonp, headers);
ResponseEntity<String> responseEntity =
rest.exchange(url, HttpMethod.PUT, requestEntity, String.class);
return responseEntity.getBody().toString();
}
上記の方法を使用して、400 Bad Requestを受け取ります
私のパラメーター、URLなどはわかっていますが、問題ありませんrestTemplate.putリクエストを次のように実行できます:
try {
restTemplate.put(getApiUrl() + "company/" + getCompanyId() + "/appointment/" + appId + "?session_token=" + r.data.session_token, map);
} catch(RestClientException j)
{
return j.toString();
}
問題(前に言ったように)は、上記のtry/catchが応答を返さないが、200応答を返すことです。
だから今私は尋ねます、何が間違っている可能性がありますか?
PUTへの応答を確認する方法は次のとおりです。リクエスト/レスポンスを完全に制御/検査するには、template.exchange(...)を使用する必要があります。
String url = "http://localhost:9000/identities/{id}";
Long id = 2l;
String requestBody = "{\"status\":\"testStatus2\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(requestBody, headers);
ResponseEntity<String> response = template.exchange(url, HttpMethod.PUT, entity, String.class, id);
// check the response, e.g. Location header, Status, and body
response.getHeaders().getLocation();
response.getStatusCode();
String responseBody = response.getBody();
ヘッダーを使用して、簡単なものをクライアントに送信できます。または、次の方法も使用できます。
restTemplate.exchange(url, HttpMethod.PUT, requestEntity, responseType, ...)
これにより、応答エンティティを返すことができます。
同じ問題があった。そして、ほとんどそれをめちゃくちゃにしました。 Wiresharkで確認:問題はリクエスト本文のエスケープ文字のようです:
String jsonp = "{\"data\":[{\"status\":\"1\"}]}";
エスケープ文字(バックスラッシュ)は解決されません。文字列はバックスラッシュで送信されますが、これは明らかに有効なjsonではないため、有効なリクエスト(-body)はありません。
すべてのプロパティをマッピングするオブジェクトですべてをフィードすることで、これを回避しました。