gpt4 book ai didi

java - AsyncRestTemplate '#' 查询参数中的符号编码

转载 作者:行者123 更新时间:2023-12-02 10:04:45 24 4
gpt4 key购买 nike

我正在使用AsyncRestTemplate从 Springboot 1.5.2 服务对 Google map 进行 API 调用。不幸的是,我的一些搜索字符串包含井号/井号标签 #并且在我的搜索参数中没有正确编码。我正在使用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

请注意,# 仍在地址参数中,而应根据 docs 将其编码为 %23 .

深入调试器,似乎 # (10&key=some_key) 后面的字符串被视为 fragment的网址。这就是为什么 # 永远不会被编码。

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

我唯一能想到的就是用 number 替换 #,这确实有效,但感觉很hacky/次优。

感谢您的帮助。

最佳答案

请注意,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

关于java - AsyncRestTemplate '#' 查询参数中的符号编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55397283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com