web-dev-qa-db-fra.com

Obtenez la réponse STRING de restTemplate.put

J'ai un problème avec Spring restTemplate.

Pour l'instant, j'envoie une demande PUT pour un service reposant et ce service reposant me renvoie des informations importantes en réponse.

La question est que restTemplate.put est une méthode void et non une chaîne donc je ne peux pas voir cette réponse.

Après quelques réponses, j'ai changé de méthode et maintenant j'utilise restTemplate.exchange, voici ma méthode:

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();
}

En utilisant la méthode ci-dessus, je reçois un 400 Bad Request

Je sais que mes paramètres, URL et ainsi, sont très bien, car je peux faire une demande restTemplate.put comme ceci:

try {
    restTemplate.put(getApiUrl() + "company/" + getCompanyId() + "/appointment/" + appId + "?session_token=" + r.data.session_token, map);
} catch(RestClientException j)
{
    return j.toString();
}

Le problème (comme je l'ai déjà dit) est que le try/catch ci-dessus ne renvoie aucune réponse mais il me donne une réponse 200 .

Alors maintenant, je demande, qu'est-ce qui ne va pas?

19
Alexandre

Voici comment vous pouvez vérifier la réponse à un PUT. Vous devez utiliser template.exchange (...) pour avoir un contrôle/inspection complet de la demande/réponse.

    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();
24
dan carter

Vous pouvez utiliser l'en-tête pour envoyer quelque chose en bref à vos clients. Sinon, vous pouvez également utiliser l'approche suivante.

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

Vous pourrez obtenir une entité de réponse retournée par ce biais.

9
MCF

Eu le même problème. Et je suis presque devenu fou dessus. Vérifié dans Wireshark: Le problème semble être les caractères d'échappement du corps de la demande:

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

Le caractère d'échappement (barre oblique inverse) n'est pas résolu. La chaîne est envoyée avec les barres obliques inverses, ce qui n'est évidemment pas un json valide et donc pas de requête valide (-body).

J'ai contourné cela en alimentant tout avec un objet, c'est-à-dire en cartographiant toutes les propriétés.

0
Guest