Muszę wykonać REST
połączenie, które zawiera niestandardowe nagłówki i parametry zapytania. Ustawiam HttpEntity
tylko z nagłówkami (bez treści) i używam RestTemplate.exchange()
metody w następujący sposób:
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);
Nie udaje się to po stronie klienta, dispatcher servlet
ponieważ nie można rozwiązać żądania do programu obsługi. Po debugowaniu wygląda na to, że parametry żądania nie są wysyłane.
Kiedy dokonuję wymiany za POST
pomocą treści żądania i bez parametrów zapytania, działa to dobrze.
Czy ktoś ma jakieś pomysły?
exchange
nagetForEntity
:restTemplate.getForEntity(builder.build().encode().toUri(), String.class);
dla uproszczenia.exchange
i podaćParameterizedTypeReference
. Przykład można jednak jeszcze uprościć, zastępującbuilder.build().encode().toUri()
gobuilder.toUriString()
.builder.toUriString()
Zmienne uriVariables są również rozwijane w ciągu zapytania. Na przykład następujące wywołanie rozszerzy wartości zarówno konta, jak i nazwy:
więc rzeczywisty adres URL żądania będzie
Spójrz na HierarchicalUriComponents.expandInternal (UriTemplateVariables), aby uzyskać więcej informacji. Wersja Spring to 3.1.3.
źródło
UriComponentsBuilder
, ponieważ powoduje to generowanie innej metryki dla każdego żądania zMicrometer
RestTemplate
ma równoległe metody określania albo tablicy pozycyjnej wartości (Object... uriVariables
), albo mapy nazwanych wartości (Map<String, ?> uriVariables
). Brzmi jak wersja mapy jest to, co chcesz:restTemplate.exchange(url, HttpMethod.GET, httpEntity, clazz, urlVariablesMap)
.Co najmniej od wiosny 3, zamiast używać
UriComponentsBuilder
do budowania URL (co jest nieco rozwlekły), wiele zRestTemplate
metod zaakceptować zastępcze w ścieżce dla parametrów (nie tylkoexchange
).Z dokumentacji:
Odniesienie: https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-resttemplate-uri
Jeśli spojrzeć na JavaDoc dla
RestTemplate
i wyszukać „URI Szablon”, można zobaczyć, jakie metody można korzystać z zastępczych.źródło
OK, więc jestem idiotą i mylę parametry zapytania z parametrami adresu URL. Miałem trochę nadziei, że będzie lepszy sposób na wypełnienie moich parametrów zapytania niż brzydki połączony ciąg, ale tak jest. Jest to po prostu przypadek zbudowania adresu URL z poprawnymi parametrami. Jeśli przekażesz go jako String String, zajmie się także kodowaniem.
źródło
Próbowałem czegoś podobnego, a przykład RoboSpice pomógł mi to wypracować :
źródło
RestTemplate: Zbuduj dynamiczny URI przy użyciu UriComponents (zmienna URI i parametry żądania)
źródło
Konwersja mapy skrótu na ciąg parametrów zapytania:
źródło
Mam inne podejście, możesz się zgodzić lub nie, ale chcę kontrolować z pliku .properties zamiast skompilowanego kodu Java
Wewnątrz pliku application.properties
endpoint.url = https: // yourHost / resource? requestParam1 = {0} & requestParam2 = {1}
Tutaj jest kod Java, możesz napisać if lub zmienić warunek, aby dowiedzieć się, czy adres URL punktu końcowego w pliku .properties ma @PathVariable (zawiera {}) lub @RequestParam (twójURL? Klucz = wartość) itp., A następnie odpowiednio wywołaj metodę .. , w ten sposób jego dynamika i nie trzeba zmieniać kodu w przyszłości one stop shop ...
Próbuję podać więcej pomysłów niż rzeczywisty kod tutaj ... spróbuj napisać metodę ogólną dla @RequestParam i @PathVariable itp. ... a następnie odpowiednio zadzwoń, gdy zajdzie taka potrzeba
źródło
W Spring Web 4.3.6 również widzę
Oznacza to, że nie musisz tworzyć brzydkiej mapy
Więc jeśli masz ten adres URL
Możesz albo
lub
źródło
źródło
Jeśli przekażesz parametry nie sparametryzowane dla RestTemplate, będziesz mieć jedną Metrykę dla każdego z osobna podając inny adres URL, biorąc pod uwagę parametry. Chcesz użyć sparametryzowanych adresów URL:
zamiast
Drugi przypadek to to, co otrzymujesz za pomocą klasy UriComponentsBuilder.
Jednym ze sposobów wdrożenia pierwszego zachowania jest:
źródło
Jeśli masz adres URL
http://localhost:8080/context path?msisdn={msisdn}&email={email}
następnie
działa w przypadku metody wymiany szablonów zgodnie z opisem użytkownika
źródło