AsyncRestTemplate '#' 在查询参数中对编码进行签名

我正在使用AsyncRestTemplate从Springboot 1.5.2服务对Google Maps进行API调用。不幸的是,我的一些搜索字符串包含井号/主题标签符号,并且在我的搜索参数中没有正确编码。我正在使用交换方法。#


地址示例如下: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


深入调试器,似乎()后面的字符串被当作URL的片段。因此,为什么永远不会被编码。#10&key=some_key#


是否有人能够使用 AsyncRestTemplate 在您的查询参数中提交符号?#


我唯一能想到的是 替换为 ,这实际上有效,但感觉很笨拙/不理想。#number


感谢您的帮助。


开满天机
浏览 90回答 1
1回答

杨魅力

请注意,这是一个模板,编码的参数在其中进行插值。因此,您无法将实际参数作为 URL 的一部分提供。您需要将字符串更改为如下所示的模板googleUrlfinal&nbsp;String&nbsp;googleUrl&nbsp;=&nbsp;"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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java