2013-06-03 5 views
9

У меня возникла проблема с использованием Spring restTemplate.Получить ответ STRING от restTemplate.put

На данный момент я отправляю запрос PUT для обслуживания, и эта служба обслуживания возвращает мне важную информацию в ответ.

Вопрос заключается в том, что restTemplate.put является методом недействительного и не строки поэтому я не могу видеть, что ответ.

После некоторых ответов я изменить мой метод, и теперь я использую 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 не возвращает никакого ответа, но дает мне ответ .

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

+0

Используйте 'методы execute': http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/client/RestTemplate.html –

+2

@Alexandre: Обычно HTTP PUT используется для операций, которые пользователь знает. Например, чтобы обновить что-то, мы можем использовать HTTP PUT, там он не предназначен для возврата тела ответа. Может быть кодом состояния или сообщением о состоянии, которое вы можете отправить. Для этого вы можете использовать заголовки, чтобы сделать это. Если вы ожидаете тело ответа, это означает, что вы должны отклоняться от HTTP PUT до HTTP POST. Там вы сможете прочитать ответ надлежащим образом. – MCF

+0

@MCF, к сожалению, для обслуживания, которое я получаю, требуется PUT для обновления информации об объекте и возврата информации об обновлении. Если я отправлю запрос POST, обратная ошибка возврата службы. – Alexandre

ответ

8

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

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

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

+0

Я до сих пор не понимаю, что вы подразумеваете под _ помощью Заголовок, чтобы отправить что-то кратким для ваших клиентов. –

+0

@SotiriosDelimanolis Я видел apporach, где Заголовки посылают очень краткую информацию через HTTP.PUT. Клиентам необходимо прочитать заголовки и получить их. – MCF

+0

Предположим, что вы хотите сообщить клиентам, что операция, которая была выполнена через HTTP.PUT, не увенчалась успехом. В этом случае со стороны сервера мы можем установить дополнительный параметр заголовка, чтобы сообщить об этом инциденте. Поэтому люди, которые запросили HTTP.PUT, будут знать, по крайней мере, прочитав заголовок. – MCF

16

Вот как вы можете проверить ответ на 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(); 
+0

Ваш пример использования HttpHeaders решил эту проблему для меня. Я использовал StringEntity вместо HttpHeaders и получал 400 ошибок таким образом. –

 Смежные вопросы

  • Нет связанных вопросов^_^