Получите ответ STRING от restTemplate.put

У меня возникла проблема с использованием 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.

Итак, теперь я спрашиваю, что может быть неправильным?

Ответ 1

Здесь вы можете проверить ответ на 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();

Ответ 2

Вы можете использовать заголовок, чтобы отправить что-то кратким для ваших клиентов. Или вы также можете использовать следующий подход.

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

Вы сможете получить ответную сущность, возвращенную через это.

Ответ 3

Была такая же проблема. И чуть не сошел с ума по этому. Проверил это в wireshark: Кажется, проблема в escape-символах из тела запроса:

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

Экранирующий символ (обратная косая черта) не разрешен. Строка отправляется с обратной косой чертой, которая, очевидно, не является допустимым json и, следовательно, не является действительным запросом (-body).

Я обошел это, снабдив все объектом, который отображает все свойства.