spring 从restTemplate.put获取字符串响应

gz5pxeao  于 2023-03-16  发布在  Spring
关注(0)|答案(4)|浏览(145)

我在使用Spring restTemplate时遇到问题。
现在,我发送一个PUT请求,请求一个restful服务,restful服务返回重要的信息作为响应。
问题是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错误请求
我知道我的参数,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 响应。
所以我现在要问,会有什么问题呢?

sdnqo3pr

sdnqo3pr1#

下面是检查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();
jexiocij

jexiocij2#

你可以使用标题向你的客户发送一些简短的信息。或者你也可以使用下面的方法。

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

您将能够通过它获得一个响应实体。

5cg8jx4n

5cg8jx4n3#

也有同样的问题。几乎要疯了。在wireshark上查了一下:问题似乎出在请求主体的转义字符上:

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

转义字符(反斜杠)没有解析,String和反斜杠一起发送,这显然不是一个有效的json,因此没有有效的请求(-body)。
我绕过了这个问题,用一个对象来填充所有内容,也就是Map所有属性。

1mrurvl1

1mrurvl14#

您可以使用RestTemplate中的httpEntityCallback()responseEntityExtractor()来构造自己的put方法:

ResponseEntity<MyJsonResponse> response = restTemplate.execute(url,
    HttpMethod.PUT,
    restTemplate.httpEntityCallback(myJsonAsJavaObject),
    restTemplate.responseEntityExtractor( MyJsonResponse.class)
);

相关问题