24

我在使用 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 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响应。

所以现在我问,有什么问题?

4

3 回答 3

35

下面介绍如何检查对 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();
于 2014-07-23T22:54:09.880 回答
10

您可以使用标头向您的客户发送简短的内容。否则,您也可以使用以下方法。

restTemplate.exchange(url, HttpMethod.PUT, requestEntity, responseType, ...)

您将能够获得通过它返回的响应实体。

于 2013-06-03T14:35:09.140 回答
0

有同样的问题。几乎疯了。在wireshark中检查:问题似乎是请求正文中的转义字符:

String jsonp = "{\"data\":[{\"status\":\"1\"}]}";

转义字符(反斜杠)未解析。字符串与反斜杠一起发送,这显然不是有效的 json,因此没有有效的请求(-body)。

我通过使用对象提供所有内容来绕过这一点,即映射所有属性。

于 2019-05-17T07:10:04.450 回答