Я должен сделать REST
звонок, который включает в себя пользовательские заголовки и параметры запроса. Я установил свой HttpEntity
только с заголовками (без тела), и я использую RestTemplate.exchange()
метод следующим образом:
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);
Это терпит неудачу на стороне клиента с dispatcher servlet
неспособностью разрешить запрос к обработчику. После его отладки похоже, что параметры запроса не отправляются.
Когда я делаю обмен с POST
использованием тела запроса и без параметров запроса, он работает просто отлично.
У кого-нибудь есть идеи?
exchange
наgetForEntity
:restTemplate.getForEntity(builder.build().encode().toUri(), String.class);
для простоты.exchange
и предоставитьParameterizedTypeReference
. Этот пример может быть еще более упрощен, если заменитьbuilder.build().encode().toUri()
наbuilder.toUriString()
.builder.toUriString()
UriVariables также раскрываются в строке запроса. Например, следующий вызов расширит значения для учетной записи и имени:
поэтому фактический URL запроса будет
Посмотрите на HierarchicalUriComponents.expandInternal (UriTemplateVariables) для более подробной информации. Версия Spring 3.1.3.
источник
UriComponentsBuilder
ни того, ни другого, так как это приводит к тому, что он генерирует разные метрики для каждого запроса с помощьюMicrometer
RestTemplate
имеет параллельные методы для определения либо позиционного массива значений (Object... uriVariables
), либо карты именованных значений (Map<String, ?> uriVariables
). Звуки как версия карты является то , что вы хотите:restTemplate.exchange(url, HttpMethod.GET, httpEntity, clazz, urlVariablesMap)
.Поскольку по крайней мере Spring 3, вместо того , чтобы использовать
UriComponentsBuilder
для создания URL (который немного многословный), многие изRestTemplate
методов принимают заполнители в пути для параметров (не толькоexchange
).Из документации:
Ссылка: https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-resttemplate-uri
Если вы посмотрите на JavaDoc для
RestTemplate
и поиска «URI шаблона», вы можете увидеть , какие методы можно использовать заполнители.источник
Итак, я идиот и путаю параметры запроса с параметрами url. Я надеялся, что был бы более хороший способ заполнить параметры моего запроса, а не безобразно сцепленную строку, но мы здесь. Это просто случай построения URL с правильными параметрами. Если вы передадите его как String Spring, он также позаботится о кодировке для вас.
источник
Я пытался что-то подобное, и пример RoboSpice помог мне разобраться :
источник
RestTemplate: создание динамического URI с использованием UriComponents (переменная URI и параметры запроса)
источник
Преобразование хэш-карты в строку параметров запроса:
источник
Я использую другой подход, вы можете согласиться или нет, но я хочу управлять из файла .properties вместо скомпилированного кода Java
Внутри файла application.properties
endpoint.url = https: // yourHost / resource? requestParam1 = {0} & requestParam2 = {1}
Здесь идет код Java, вы можете написать условие if или switch, чтобы узнать, имеет ли URL-адрес конечной точки в файле .properties значение @PathVariable (содержит {}) или @RequestParam (yourURL? Key = value) и т. Д., А затем вызвать метод соответствующим образом. Таким образом, его динамика и не нужно менять код в будущем один стоп магазин ...
Я пытаюсь дать больше идеи, чем фактический код здесь ... попробуйте написать универсальный метод для @RequestParam, @PathVariable и т. Д. ... и затем вызывать соответственно при необходимости
источник
В Spring Web 4.3.6 я тоже вижу
Это означает, что вам не нужно создавать уродливую карту
Так что если у вас есть этот URL
Вы можете сделать
или
источник
источник
Если вы передадите непараметризованные параметры для RestTemplate, у вас будет один показатель для каждого отдельного URL, который вы передаете, с учетом параметров. Вы хотели бы использовать параметризованные URL:
вместо того
Второй случай - это то, что вы получаете, используя класс UriComponentsBuilder.
Одним из способов реализации первого поведения является следующее:
источник
Если ваш URL
http://localhost:8080/context path?msisdn={msisdn}&email={email}
затем
работает по методу замены resttemplate, как описано вами
источник