AsyncRestTemplate '#' кодировка знака в параметре запроса - PullRequest
0 голосов
/ 28 марта 2019

Я использую 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, что на самом деле работает, но кажется хакерским / неоптимальным.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 28 марта 2019

Обратите внимание, что googleUrl - это шаблон, в который закодированные параметры интерполируются в. Таким образом, вы не можете предоставить фактические параметры как часть URL. Вам нужно изменить строку в шаблон, подобный этому

final String googleUrl = "https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={key}";

Возвращает правильную кодировку:

https://maps.googleapis.com/maps/api/geocode/json?address=05406,%20VT,%20BURLINGTON,%20309%20College%20St%20%2310&key=some_key
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...