我在使用Spring restTemplate时遇到了问题。
现在我正在发送PUT请求,以获得宁静的服务,而宁静的服务会将重要的信息发回给我。
问题是 restTemplate.put 是 void 方法,而不是字符串,因此我看不到该响应。
根据一些答案,我改变了我的方法,现在我正在使用 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错误请求
我知道我的参数,网址等都很好,因为我可以这样做 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 响应。
所以现在我问,哪有什么不对?
答案 0 :(得分:23)
以下是检查对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();
答案 1 :(得分:9)
您可以使用标题向您的客户简要发送内容。否则您也可以使用以下方法。
restTemplate.exchange(url, HttpMethod.PUT, requestEntity, responseType, ...)
您将能够通过该回复获得响应实体。
答案 2 :(得分:0)
有同样的问题。几乎疯了。在Wireshark中进行了检查:问题似乎是来自请求正文的转义字符:
String jsonp = "{\"data\":[{\"status\":\"1\"}]}";
转义字符(反斜杠)未解析。字符串与反斜杠一起发送,这显然不是有效的json,因此也没有有效的请求(-body)。
我通过向所有对象提供对象(即映射所有属性)来绕过此操作。