Bei der Entwurf der REST -Schnittstelle ist die Verwendung von RestTemplate für Schnittstellentests eine gemeinsame Methode, aber während der zahlreichen Methoden und Parameter haben viele Schüler die Unterschiede zwischen den Methoden zur Einreichung von Formular und Nutzlast verwirrt. Darüber hinaus unterscheidet sich das Schnittstellendesign von den von herkömmlichen Browsern verwendeten Einreichungsmethoden. Es treten häufig verschiedene Fehler auf, wie z. B. 405 Fehler oder die eingereichten Daten können überhaupt nicht erhalten werden. Die Fehlerproben sind wie folgt:
Ausnahme im Thread "Main" org.springframework.web.client.httpclenterrorexception: 405 Methode nicht zulässig
bei org.springframework.web.client.defaultResponseerrorHandler.handleError (DefaultResponseErrorHandler.java:63)
bei org.springframework.web.client.resttemplate.handleresponse (restTemplate.java:700)
unter org.springframework.web.client.resttemplate.doexecute (restTemplate.java:653)
at org.springframework.web.client.resttemplate.execute (restTemplate.java:613)
bei org.springframework.web.client.resttemplate.exchange (restTemplate.java:531)
1. Senden Sie mit der Exchange -Methode
Exchange kann beide Post -Methoden ausführen und erhalten, sodass er am weitesten verbraucht ist und die Verwendung wie folgt ist:
String url = "http: // localhost/mirana-ee/app/login"; restTemplate client = new rastTemplate (); In most cases, the submission method is form submission headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);// Encapsulate parameters, do not replace them with Map and HashMap, otherwise the parameters cannot be passed MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();// also supports Chinese params.add("username", "Benutzername"); params.add ("Passwort", "123456"); String.class); // Ausgabeergebnis system.out.println (response.getBody ());2. Einreichen mit Postforentity
Postdorentity ist eine Vereinfachung des Austauschs und erfordert nur die Reduzierung des Parameters httpmeThod.post wie folgt:
// Der obige Code ist genau der gleiche // Sie müssen nur die Exchange -Methode Antwort <string> response = client.postForentity (URL, RequestEntity, String.Class) ersetzen.
A
Wenn Sie in den Controller -Methodenparametern "@ModelAttribute" in "@RequestBody" -Notation ändern, ist die Einreichungsmethode zu diesem Zeitpunkt die Nutzlastmethode. Das Codebeispiel lautet wie folgt:
// Bitte beachten Sie, dass @RequestBody Annotation @RequestMapping (value = "/login", method = requestMethod.post, konsumptions = "application/json") // niemals @ModelAttribute addieren Sie. Datum()); Rückgabekonto;}
Fügen Sie noch einmal "@Modelattribute" nicht wieder hinzu, da seine Priorität relativ hoch ist. Das System verwendet das Formular, um den eingereichten Inhalt zu analysieren.
Für die Nutzlastmethode muss der eingereichte Inhalt String sein und der Header muss auf "Anwendung/JSON" eingestellt werden. Das Beispiel lautet wie folgt:
// Adressstring-String url = "http: // localhost/mirana-ee/app/login"; restTemplate client = new rastTemplate (); // Stellen Sie sicher, dass Headerhttpheader Headers = new Httpheaders (); ObjectMapperObjectMapper Mapper durch Bean Injection = new ObjectMapper (); map <string, string> params = maps.newhashMap (); params.put ("Benutzername", "inter"); params.put ("password", "123456"); String value = mapper.writeValUeString (Params); Httpentity <string> (Wert, Header); // HTTP Request Antwort Antwort <string> response = client.postForentity (URL, RequestEntity, String.class); System.out.println (response.getBody ());Wenn der Inhalt nicht im String -Modus übermittelt wird, wird der folgende Fehler auf jeden Fall angezeigt:
Ausnahme in Thread "Main" org.springframework.web.client.httpclenterrorexception: 400 Schlechte Anfrage
bei org.springframework.web.client.defaultResponseerrorHandler.handleError (DefaultResponseErrorHandler.java:63)
bei org.springframework.web.client.resttemplate.handleresponse (restTemplate.java:700)
unter org.springframework.web.client.resttemplate.doexecute (restTemplate.java:653)
at org.springframework.web.client.resttemplate.execute (restTemplate.java:613)
unter org.springframework.web.client.resttemplate.postforentity (restTemplate.java:407)
Schließlich sollte betont werden, dass die Anfrageparameter nicht über @RequestBody erhalten werden können. Wenn der Code auf dem obigen Server in das folgende Format geändert wird, erhalten Sie die Daten definitiv nicht, aber das Gegenteil ist für die Einreichung von Formularen zutreffend.
@RequestMapping (value = "/login", Consumers = "Application/JSON", method = requestMethod.post) öffentliches Konto getAccount (@RequestBody -Konto, httpServletRequest -Anforderung) {// Sie dürfen nicht das Parameter -Wert -System.out.out.println (Request.GetParameter ("Username"); Account.SetVersion (neuer Datum ()); Rückgabekonto;}4. Struktur der Httpentität
HTTPentity ist eine Verkapselung von HTTP -Anforderungen, die zwei Teile, Kopfzeile und Körper enthält. Der Header wird verwendet, um den Anforderungsheader festzulegen, und der Körper wird verwendet, um den Anforderungskörper festzulegen, sodass sein Konstruktor wie folgt ist:
// Wert ist der Anforderungskörper // Header ist der Anforderungsheader httpentity <string> requestEntity = new httpentity <string> (Wert, Header);
5. Httpentity und Urivariablen
Bei der Verwendung von RestTemplate wird Httpentity verwendet, um bestimmte Parameterwerte zu übergeben, während Urivariablen verwendet werden, um die HTTP -Adresse anstelle der Adressparameter zu formatieren. Die richtige Verwendung ist wie folgt:
// Formatierungsparameter addieren pathstring url = "http: // localhost/mirana-ee/app/{path}"; // Formatierungsparameter map <String, String> varparams = maps client.postForentity (URL, RequestEntity, String.Class, Varparams);6. Hinweise zu httpMessageConverter
In vielen Online -Beispielen stellte ich fest, dass viele Menschen kundenspezifische httpMessageConverter hinzugefügt haben, um die Nutzlast -Einreichungen wie folgt zu verarbeiten:
// Es ist nicht erforderlich, client.getMessageConverters () hinzuzufügen (neue mapingjackson2httpMessageConverter ()); client.getMessageConverters (). add (neuer StringHttpMessageConverter ());
Nachdem ich den Quellcode überprüft und debugged überprüft hatte, stellte ich fest, dass RestTemplate 7 Arten von httpMessageConvertern integriert hat, wie folgt:
1. org.springframework.http.converter.BytearrayhttpMessageConverter
2. org.springframework.http.converter.stringhttpMessageConverter
3.. Org.springframework.http.converter.resourcehttpMessageConverter
V
5. org.springframework.http.converter.support.AllencompassingFormhttpMessageConverter
6. org.springframework.http.converter.xml.jaxb2RootelementhttpMessageConverter
7. org.springframework.http.converter.json.mappingjackson2httpMessageConverter
„`
abschließend
RestTemplate kann die Schwierigkeit des Sendens von Formulardaten erheblich vereinfachen und sind mit der Funktion des automatischen Konvertierens von JSON -Daten ausgestattet. Wenn wir jedoch nur durch das Verständnis der Zusammensetzungsstruktur von Httpentity (Header und Körper) und den Unterschieden mit Urivariablen verstehen, können wir seine Verwendung wirklich verstehen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.