Я использую AsyncRestTemplate
для вызова API-интерфейса Google Maps из службы Springboot 1.5.2. К сожалению, некоторые из моих строк поиска содержат знак фунта / хэштега #
и неправильно кодируются в моих параметрах поиска. Я использую метод exchange
.
Пример ниже для адреса 05406, VT, BURLINGTON, 309 College St #10
:
@Service
public class ExampleAsyncRestTemplate {
private AsyncRestTemplate asyncRestTemplate;
@Autowired
public ExampleAsyncRestTemplate() {
this.asyncRestTemplate = new AsyncRestTemplate();
}
public ListenableFuture<ResponseEntity<T>> getGeoCodedAddress() {
String googleUrl = "https://maps.googleapis.com/maps/api/geocode/json?address=05406, VT, BURLINGTON, 309 College St #10&key=some_key";
Map<String, String> uriVariables = new HashMap<>();
uriVariables.put("address", "05406, VT, BURLINGTON, 309 College St #10");
uriVariables.put("key", "some_key");
return asyncRestTemplate.exchange(googleUrl, HttpMethod.GET, new HttpEntity<>(), GoogleResponse.class, uriVariables);
}
}
Полученный URL кодируется как:
https://maps.googleapis.com/maps/api/geocode/json?address=05406,%20VT,%20BURLINGTON,%20309%20College%20St%20#10&key=some_key
Обратите внимание, что #
все еще находится в параметре адреса, когда он должен быть закодирован как %23
согласно docs
.
Копание в отладчике, похоже, что строка после #
(10&key=some_key
) берется как fragment
URL. Следовательно, #
никогда не кодируется.
Кто-нибудь смог отправить #
знаки в параметрах вашего запроса с помощью AsyncRestTemplate?
Единственное, что мне удалось придумать, - это заменить #
на number
, что на самом деле работает, но кажется хакерским / неоптимальным.
Спасибо за вашу помощь.