Dans la conception de l'interface de repos, l'utilisation de Rest -mplate pour les tests d'interface est une méthode courante, mais pendant l'utilisation, en raison des nombreuses méthodes et paramètres, de nombreux étudiants ont confondu les différences entre la soumission de formulaire et les méthodes de soumission de la charge utile. De plus, la conception de l'interface est différente des méthodes de soumission utilisées par les navigateurs traditionnels. Diverses erreurs se produisent souvent, telles que 405 erreurs, ou les données soumises ne peuvent pas être obtenues du tout. Les échantillons d'erreur sont les suivants:
Exception dans le thread "Main" org.springframework.web.client.httpclientErrorexception: 405 Méthode non autorisée
sur org.springframework.web.client.defaultreSponseerrorHandler.handleerror (DefaulTResponseerrorHandler.java:63)
sur org.springframework.web.client.resttremplate.handleResponse (restTEmplate.java:700)
sur org.springframework.web.client.restTemplate.DoExECUTE (RestTemplate.java:653)
sur org.springframework.web.client.resttemplate.execute (restLEmplate.java:613)
sur org.springframework.web.client.resttemplate.exchange (restLEmplate.java:531)
1. Soumettre en utilisant la méthode d'échange
Exchange peut exécuter à la fois des méthodes de post et obtient, il est donc le plus largement utilisé et l'utilisation est la suivante:
String url = "http: // localhost / mirana-ee / app / ligin"; restTemplate client = new restTemplate (); httpheaders en-têtes = new httpheaders (); // ne pas modifier facilement cette méthode de soumission. Dans la plupart des cas, la méthode de soumission est les en-têtes de soumission de formulaire. "username");params.add("password", "123456");HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);// Execute HTTP request ResponseEntity<String> response = client.exchange(url, HttpMethod.POST, requestEntity, String.class); // Sortie System.out.println (réponse.getBody ());2. Soumettre avec la post-fortificité
La post-fortificité est une simplification de l'échange et ne nécessite que la réduction du paramètre httpMethod.post, comme suit:
// Le code ci-dessus est exactement le même // vous n'avez besoin que de remplacer la méthode d'échange réponse <string> réponse = client.postForEntity (url, requestEntity, string.class);
3. À propos de la différence entre la soumission du formulaire et la soumission de la charge utile
Dans les paramètres de la méthode du contrôleur, si vous modifiez "@ModeLattribute" à l'annotation "@Requestbody", la méthode de soumission à l'heure actuelle est la méthode de charge utile. L'exemple de code est le suivant:
// Veuillez noter que @Requestbody Annotation @RequestMapping (value = "/ login", méthode = requestMethod.post, Consumpes = "Application / JSON") // Never Ajouter @ModelAttribute, sinon il sera remplacé, comme cela suivant // le compte public getAccount (@ requestbody @ metodelatTribute Accounty Accounty GetAccount (@requestbody Date()); Retour compte;}
Encore une fois, n’ajoutez pas à nouveau «@ModelAttribute», car sa priorité est relativement élevée, le système utilisera le formulaire pour analyser le contenu soumis.
Pour la méthode de charge utile, le contenu soumis doit être une chaîne et l'en-tête doit être défini sur "Application / JSON". L'exemple est le suivant:
// Demande d'adresse Url = "http: // localhost / mirana-eee / app / ligin"; restTEmplate client = new restTemplate (); // assurez-vous de définir en têtehttpheaders en-têtes = new httpheaders (); ObjectMapperObjectMapper Mappel via bean injection = new ObjectMapper (); map <string, string> params = maps.newhashmap (); params.put ("username", "inter"); params.put ("mot de passe", "123456"); string value = maaker.writevalueaSString (params); httpentity <string> requestnity = new Httpentity <string> (valeur, en-têtes); // exécuter la demande http réponse <string> réponse = client.postForEntity (url, requestEntity, string.class); System.out.println (réponse.getBody ());Si le contenu n'est pas soumis en mode chaîne, l'erreur suivante apparaîtra certainement:
Exception dans le thread "Main" org.springframework.web.client.httpclientErrorexception: 400 Bad Request
sur org.springframework.web.client.defaultreSponseerrorHandler.handleerror (DefaulTResponseerrorHandler.java:63)
sur org.springframework.web.client.resttremplate.handleResponse (restTEmplate.java:700)
sur org.springframework.web.client.restTemplate.DoExECUTE (RestTemplate.java:653)
sur org.springframework.web.client.resttemplate.execute (restLEmplate.java:613)
sur org.springframework.web.client.restTemplate.postForEntity (resttemplate.java:407)
Enfin, il convient de souligner que les paramètres de demande ne peuvent pas être obtenus via @Requestbody. Si le code sur le serveur ci-dessus est modifié au format suivant, vous n'obtiendrez certainement pas les données, mais l'inverse est vrai pour la soumission de formulaire.
@RequestMapping (value = "/ login", consacrés = "application / json", méthode = requestMethod.post) public compte GetAccount (@Requestbody Account, httpservletRequest request) {// vous ne devez pas obtenir le paramètre de valeur System.out.println (request.getParamet ("username")); account.setVersion (new Date ()); Retour compte;}4. Structure de l'Httpentity
Httpentity est une encapsulation des demandes HTTP, qui contient deux parties, en-tête et corps. L'en-tête est utilisé pour définir l'en-tête de demande, et le corps est utilisé pour définir le corps de la demande, donc son constructeur est le suivant:
// La valeur est le corps de demande // l'en-tête est l'en-tête de demande httpentity <string> requestEntity = new httpentity <string> (valeur, en-têtes);
5. Httpentity et urivariables
Dans l'utilisation de RestTemplate, Httpentity est utilisé pour transmettre des valeurs de paramètres spécifiques, tandis que les urivariables sont utilisés pour formater l'adresse HTTP au lieu des paramètres d'adresse. L'utilisation correcte est la suivante:
// Ajouter des paramètres de formatage pathstring url = "http: // localhost / mirana-eee / app / {path}"; // préparer les paramètres de formatage map <string, string> varParams = maps.newhashmap (); varParams.put ("path", "ligin"); // autres codes sont omis // formater la réponse à la réponse de la traite = client.PostForEntity (URL, requestEntity, String.class, VarParams);6. Remarques sur HttpMessageConverter
Dans de nombreux exemples en ligne, j'ai constaté que de nombreuses personnes ont ajouté HttpMessageConverter personnalisé pour gérer les soumissions de charge utile, comme suit:
// il n'est pas nécessaire de client.getMessageConverters (). Add (new MappingJackson2HttPMessageConverter ()); client.getMessageConverters (). Add (new StringHttpMessageConverter ());
Ensuite, après avoir vérifié le code source et débogué, j'ai constaté que Rest -mplate a intégré 7 types de HttpMessageConverters, comme suit:
1. Org.springframework.http.converter.bytearrayhttpMessageConverter
2. Org.springframework.http.converter.StringhttpMessageConverter
3. Org.springframework.http.converter.resourcehttpMessageConverter
4. org.springframework.http.converter.xml.sourcehttpmessageConverter
5. org.springframework.http.converter.support.AtenCompassingFormHttpMessageConverter
6. org.springframework.http.converter.xml.jaxb2rootementHttpMessageConverter
7. Org.springframework.http.converter.json.mappingjackson2httpmessageConverter
""
en conclusion
RestTemplate peut simplifier considérablement la difficulté de soumettre des données de formulaire et est livrée avec la fonction de convertir automatiquement les données JSON. Cependant, ce n'est qu'en comprenant la structure de composition de l'Httpentity (en-tête et corps) et en comprenant les différences avec les urivariables, pouvons-nous vraiment comprendre son utilisation.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.