Ich muss einen REST
Anruf tätigen , der benutzerdefinierte Header und Abfrageparameter enthält. Ich setze meine HttpEntity
nur mit den Headern (kein Body) und verwende die RestTemplate.exchange()
Methode wie folgt:
HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "application/json");
Map<String, String> params = new HashMap<String, String>();
params.put("msisdn", msisdn);
params.put("email", email);
params.put("clientVersion", clientVersion);
params.put("clientType", clientType);
params.put("issuerName", issuerName);
params.put("applicationName", applicationName);
HttpEntity entity = new HttpEntity(headers);
HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class, params);
Dies schlägt auf Client-Seite fehl dispatcher servlet
, da die Anforderung an einen Handler nicht aufgelöst werden kann. Nach dem Debuggen werden die Anforderungsparameter anscheinend nicht gesendet.
Wenn ich einen Austausch mit einem POST
Anforderungshauptteil und ohne Abfrageparameter durchführe, funktioniert dies einwandfrei.
Hat jemand irgendwelche Ideen?
exchange
zugetForEntity
: derrestTemplate.getForEntity(builder.build().encode().toUri(), String.class);
Einfachheit halber.exchange
und angebenParameterizedTypeReference
. Das Beispiel kann jedoch weiter vereinfacht werden, indem esbuilder.build().encode().toUri()
durch ersetzt wirdbuilder.toUriString()
.builder.toUriString()
Die uriVariables werden auch in der Abfragezeichenfolge erweitert. Der folgende Aufruf erweitert beispielsweise die Werte für Konto und Name:
Die tatsächliche Anforderungs-URL lautet also
Weitere Informationen finden Sie unter HierarchicalUriComponents.expandInternal (UriTemplateVariables). Die Version von Spring ist 3.1.3.
quelle
UriComponentsBuilder
da es dazu führt, dass für jede Anfrage mitMicrometer
RestTemplate
verfügt über parallele Methoden zum Angeben eines Positionsarrays von Werten (Object... uriVariables
) oder einer Karte mit benannten Werten (Map<String, ?> uriVariables
). Klingt so, als ob die Kartenversion genau das ist, was Sie wollen :restTemplate.exchange(url, HttpMethod.GET, httpEntity, clazz, urlVariablesMap)
.Da zumindest Feder 3, anstelle der Verwendung
UriComponentsBuilder
der URL aufzubauen (was ein Bit ausführlich ist), viele derRestTemplate
Verfahren akzeptieren Platzhalter in den Pfad für die Parameter (nicht nurexchange
).Aus der Dokumentation:
Referenz: https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-resttemplate-uri
Wenn Sie im JavaDoc nach
RestTemplate
"URI-Vorlage" suchen, können Sie sehen, mit welchen Methoden Sie Platzhalter verwenden können.quelle
OK, ich bin ein Idiot und verwechsle Abfrageparameter mit URL-Parametern. Ich hatte gehofft, dass es eine bessere Möglichkeit gibt, meine Abfrageparameter zu füllen, als eine hässliche verkettete Zeichenfolge, aber da sind wir. Es geht einfach darum, die URL mit den richtigen Parametern zu erstellen. Wenn Sie es als String übergeben, übernimmt Spring Spring auch die Codierung für Sie.
quelle
Ich habe etwas Ähnliches versucht, und das RoboSpice-Beispiel hat mir dabei geholfen, es herauszufinden :
quelle
RestTemplate: Erstellen eines dynamischen URI mithilfe von UriComponents (URI-Variable und Anforderungsparameter)
quelle
Konvertieren einer Hash-Map in eine Zeichenfolge von Abfrageparametern:
quelle
Ich verfolge einen anderen Ansatz, Sie können zustimmen oder nicht, aber ich möchte aus der .properties-Datei anstelle von kompiliertem Java-Code steuern
In der Datei application.properties
endpoint.url = https: // yourHost / resource? requestParam1 = {0} & requestParam2 = {1}
Hier finden Sie Java-Code. Sie können if- oder switch-Bedingungen schreiben, um herauszufinden, ob die Endpunkt-URL in der .properties-Datei @PathVariable (enthält {}) oder @RequestParam (yourURL? Key = value) usw. enthält. Rufen Sie dann die Methode entsprechend auf. Auf diese Weise ist es dynamisch und muss in Zukunft nicht mehr aus einer Hand geändert werden ...
Ich versuche hier mehr Ideen als tatsächlichen Code zu geben ... versuche, jeweils eine generische Methode für @RequestParam und @PathVariable usw. zu schreiben ... und rufe sie dann bei Bedarf entsprechend auf
quelle
In Spring Web 4.3.6 sehe ich auch
Das heißt, Sie müssen keine hässliche Karte erstellen
Also, wenn Sie diese URL haben
Sie können entweder tun
oder
quelle
quelle
Wenn Sie nicht parametrisierte Parameter für RestTemplate übergeben, haben Sie eine Metrik für jede einzelne unterschiedliche URL, die Sie unter Berücksichtigung der Parameter übergeben. Sie möchten parametrisierte URLs verwenden:
anstatt
Der zweite Fall ist der, den Sie mit der UriComponentsBuilder-Klasse erhalten.
Eine Möglichkeit, das erste Verhalten zu implementieren, ist die folgende:
quelle
Wenn deine URL ist
http://localhost:8080/context path?msisdn={msisdn}&email={email}
dann
funktioniert für die von Ihnen beschriebene Resttemplate-Austauschmethode
quelle