web-dev-qa-db-fra.com

Spring RestTemplate - http GET avec le corps de la demande

Duplicata possible:
HTTP GET avec le corps de la demande

J'ai lu quelques discussions ici qui ne préconisent pas l'envoi de contenu via HTTP GET. Il existe des restrictions sur la taille des données pouvant être envoyées via des clients (navigateurs Web). Et la gestion des données GET dépend également des serveurs. Veuillez consulter la section Ressources ci-dessous.

Cependant, on m'a demandé de tester la possibilité d'envoyer du contenu via HTTP GET en utilisant RestTemplate. J'ai fait référence à quelques discussions sur le forum du printemps, mais elles n'ont pas reçu de réponse. (Veuillez noter que l'envoi de données via http Post fonctionne correctement). La discussion ici suggère d'utiliser POST à la place.

dev env - JBoss AS 5.1, Spring 3.1.3

Client

    @Test
public void testGetWithBody()
{
    // acceptable media type
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
    acceptableMediaTypes.add(MediaType.TEXT_PLAIN);

    // header
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(acceptableMediaTypes);

    // body
    String body = "hello world";
    HttpEntity<String> entity = new HttpEntity<String>(body, headers);

    Map<String, Object> uriVariables = new HashMap<String, Object>();
    uriVariables.put("id", "testFile");

    // Send the request as GET
    ResponseEntity<String> result = restTemplate.exchange(
            "http://localhost:8080/WebApp/test/{id}/body",
            HttpMethod.GET, entity, String.class, uriVariables);

    Assert.assertNotNull(result.getBody());
}

Serveur @Controller

    @RequestMapping(value = "/{id}/body", method = RequestMethod.GET)
public @ResponseBody
String testGetWithBody(@PathVariable String id,
        @RequestBody String bodyContent)
{
    return id + bodyContent;
}

Le problème - l'exécution de ce scénario de test renvoie 500 Erreur de serveur interne. Lors du débogage, j'ai trouvé que le contrôleur n'était pas touché.

  1. Est-il correct de comprendre que le RestTemplate fournit le moyen d'envoyer des données en tant que corps de la demande, mais l'erreur se produit car le serveur n'a pas pu gérer le corps de la demande?

  2. Si le corps de la demande envoyé via HTTP Get n'est pas conventionnel, pourquoi RestTemplate fournit-il les API pour permettre son envoi? Cela signifie-t-il qu'il existe peu de serveurs capables de gérer le corps de la demande via GET?

Ressources - discussions sur l'envoi de corps via HTTP GET en utilisant RestTemplate sur le forum de printemps

http://forum.springsource.org/showthread.php?129510-Message-body-with-HTTP-GET&highlight=resttemplate+http+get

http://forum.springsource.org/showthread.php?94201-GET-method-on-RestTemplate-exchange-with-a-Body&highlight=resttemplate+http+get

Ressources - Discussions générales sur l'envoi de corps via HTTP GET

get-with-request-body

est-cette-déclaration-correcte-http-get-method-always-has-no-message-body

get-or-post-when-reading-request-body

http-uri-get-limit

15
Tushar Mishra

Est-il correct de comprendre que le RestTemplate fournit le moyen d'envoyer des données en tant que corps de la demande, mais l'erreur se produit car le serveur n'a pas pu gérer le corps de la demande?

Vous pouvez le constater en regardant le trafic réseau (la demande est-elle envoyée avec un corps de demande et une méthode GET?) Et les journaux du serveur (le résultat 500 que vous recevez doit avoir un effet côté serveur qui est enregistré, et sinon, configurez le serveur pour ce faire).

Si le corps de la demande envoyé via HTTP Get n'est pas conventionnel, pourquoi RestTemplate fournit-il les API pour permettre son envoi? Cela signifie-t-il qu'il existe peu de serveurs capables de gérer le corps de la demande via GET?

Parce qu'il s'agit d'une classe générique qui vous permet également de créer des demandes pouvant inclure un corps de message.

Comme indiqué dans HTTP GET avec le corps de la demande :

En d'autres termes, tout message de requête HTTP est autorisé à contenir un corps de message, et donc [un serveur] doit analyser les messages en gardant cela à l'esprit. Cependant, la sémantique du serveur pour GET est restreinte de sorte qu'un corps, le cas échéant, n'a aucune signification sémantique pour la demande. Les exigences relatives à l'analyse sont distinctes des exigences relatives à la sémantique des méthodes.

Un corps sur un GET ne peut pas faire quoi que ce soit sémantiquement, car vous demandez une ressource. C'est comme si vous disiez au serveur: "Donnez-moi la ressource X, oh, et ayez des pommes!" . Le serveur ne se souciera pas de vos pommes et servira avec plaisir la ressource X - ou générera une erreur car il n'aime aucune offre dans une demande.

Cependant, on m'a demandé de tester la possibilité d'envoyer du contenu via HTTP GET

Veuillez indiquer à celui qui l'a demandé que ce cas ne devrait pas être testé, car aucune implémentation raisonnable ne le prend en charge.

7
CodeCaster