Je dois passer un REST
appel qui inclut des en-têtes et des paramètres de requête personnalisés. J'ai mis mon HttpEntity
avec juste les en-têtes (pas de corps), et j'utilise la RestTemplate.exchange()
méthode comme suit:
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);
Cela échoue du côté client, car il dispatcher servlet
est impossible de résoudre la demande à un gestionnaire. Après l'avoir débogué, il semble que les paramètres de demande ne soient pas envoyés.
Lorsque je fais un échange avec un POST
utilisant un corps de requête et aucun paramètre de requête, cela fonctionne très bien.
Quelqu'un a-t-il une idée?
exchange
engetForEntity
:restTemplate.getForEntity(builder.build().encode().toUri(), String.class);
pour plus de simplicité.exchange
et fournir unParameterizedTypeReference
. L'exemple peut être encore simplifié, en le remplaçantbuilder.build().encode().toUri()
parbuilder.toUriString()
.builder.toUriString()
Les uriVariables sont également développés dans la chaîne de requête. Par exemple, l'appel suivant développera les valeurs pour le compte et le nom:
de sorte que l'URL de demande réelle sera
Consultez HierarchicalUriComponents.expandInternal (UriTemplateVariables) pour plus de détails. La version de Spring est 3.1.3.
la source
UriComponentsBuilder
plus car cela provoque la génération d'une métrique différente pour chaque demande avecMicrometer
RestTemplate
a des méthodes parallèles pour spécifier soit un tableau positionnel de valeurs (Object... uriVariables
) soit une carte de valeurs nommées (Map<String, ?> uriVariables
). Sons comme la version de la carte est ce que vous voulez:restTemplate.exchange(url, HttpMethod.GET, httpEntity, clazz, urlVariablesMap)
.Depuis au moins 3 Spring, au lieu d'utiliser
UriComponentsBuilder
pour construire l'URL (qui est un peu bavard), un grand nombre desRestTemplate
méthodes acceptent des espaces réservés dans le chemin des paramètres (non seulementexchange
).De la documentation:
Référence: https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-resttemplate-uri
Si vous regardez la JavaDoc pour
RestTemplate
et recherchez "URI Template", vous pouvez voir avec quelles méthodes vous pouvez utiliser des espaces réservés.la source
OK, donc je suis un idiot et je confond les paramètres de requête avec les paramètres d'URL. J'espérais un peu qu'il y aurait une meilleure façon de remplir mes paramètres de requête plutôt qu'une chaîne concaténée laide, mais nous y sommes. Il s'agit simplement de créer l'URL avec les paramètres corrects. Si vous le passez en tant que String Spring, vous vous occuperez également de l'encodage.
la source
J'essayais quelque chose de similaire, et l'exemple RoboSpice m'a aidé à le résoudre :
la source
RestTemplate: créer un URI dynamique à l'aide d'UriComponents (variable URI et paramètres Request)
la source
Conversion d'une carte de hachage en une chaîne de paramètres de requête:
la source
J'utilise une approche différente, vous pouvez être d'accord ou non mais je veux contrôler à partir du fichier .properties au lieu du code Java compilé
Dans le fichier application.properties
endpoint.url = https: // votreHôte / ressource? requestParam1 = {0} & requestParam2 = {1}
Le code Java va ici, vous pouvez écrire if ou changer de condition pour savoir si l'URL du noeud final dans le fichier .properties a @PathVariable (contient {}) ou @RequestParam (votreURL? Clé = valeur) etc ... puis appelez la méthode en conséquence. .de cette façon sa dynamique et pas besoin de coder le changement dans le futur guichet unique ...
J'essaie de donner plus d'idées que de code réel ici ... essayez d'écrire chacune une méthode générique pour @RequestParam, et @PathVariable etc ... puis appelez en conséquence si nécessaire
la source
Dans Spring Web 4.3.6, je vois aussi
Cela signifie que vous n'avez pas à créer une moche carte
Donc, si vous avez cette URL
Vous pouvez soit faire
ou
la source
la source
Si vous transmettez des paramètres non paramétrés pour RestTemplate, vous aurez une métrique pour chaque URL unique que vous transmettez, en tenant compte des paramètres. Vous souhaitez utiliser des URL paramétrées:
au lieu de
Le deuxième cas est ce que vous obtenez en utilisant la classe UriComponentsBuilder.
Une façon d'implémenter le premier comportement est la suivante:
la source
Si votre URL est
http://localhost:8080/context path?msisdn={msisdn}&email={email}
puis
fonctionne pour la méthode d'échange resttemplate comme décrit par vous
la source