Java ApacheHTTP客户端和SpringRESTTemplate之间的差异
我正在调用GoogleTranslateAPI,一个是通过ApacheHTTP客户端,另一个是通过Spring的RestTemplate,并得到不同的结果。两者获取的URL完全相同: 我想把“科尔教授”从法语翻译成英语 使用的URL是(为了可读性,分成两行): 阿帕奇:Java ApacheHTTP客户端和SpringRESTTemplate之间的差异,java,spring,apache-httpclient-4.x,resttemplate,Java,Spring,Apache Httpclient 4.x,Resttemplate,我正在调用GoogleTranslateAPI,一个是通过ApacheHTTP客户端,另一个是通过Spring的RestTemplate,并得到不同的结果。两者获取的URL完全相同: 我想把“科尔教授”从法语翻译成英语 使用的URL是(为了可读性,分成两行): 阿帕奇: @Test public void apache() throws IOException { String response = Request.Get(URL).execute().returnContent().a
@Test
public void apache() throws IOException {
String response = Request.Get(URL).execute().returnContent().asString();
System.out.println(response);
}
返回(正确):
{
“数据”:{
“翻译”:[
{
“翻译文本”:“学校教师”
}
]
}
}
返回(不正确):
{
“数据”:{
“翻译”:[
{
“翻译文本”:“教授+%C3%A9coles”
}
]
}
}
RestTemplate HTTP头配置中是否缺少某些内容?接受字符串的方法执行URL编码
对于每个HTTP方法,有三个变体:两个接受URI
模板字符串和URI变量(数组或映射),而第三个接受
URI。注意,对于URI模板,假设编码是
必要,例如restTemplate.getForObject(“http://example.com/hotel
列表“
变为”http://example.com/hotel%20list“
这也意味着如果
URI模板或URI变量已编码,双重编码
将发生,例如http://example.com/hotel%20list
变为
http://example.com/hotel%2520list
)
假设您已经提供了以下字符串
作为第一个参数
https://www.googleapis.com/language/translate/v2?key=MY_KEY&source=fr&target=en&q=Professeur+des+%C3%A9coles
必须对字符%
进行编码。因此,q
参数的值变为
Professeur%2Bdes%2B%25C3%25A9coles
如果你愿意,这相当于
Professeur+des+%C3%A9coles
谷歌的翻译服务不知道如何处理%C3%A9coles
正如文件所示
为了避免这种情况,请使用URI方法变量来提供(或重复使用)一个
以前编码的URI。准备这样一个URI,完全控制
编码,考虑使用.< /P>
与其使用接受字符串的重载,不如自己构造一个URI并使用它
Apache没有指定行为,但字符串值似乎按原样处理。首先要做的是弄清楚每个客户端在请求中到底发送了什么。有不同的方法可以做到这一点-我要做的是使用netcat在您的机器上打开一个侦听套接字,然后更改为URL,使其指向localhost-netcat然后会逐字打印HTTP请求。我猜Spring客户端正在对编码的“é”字符做一些奇怪的事情。当短语只有ASCII字符时,它是否正常工作?是的-简单的ASCII对两者都非常有效-这与编码有关。使用wireshark或membrane monitor proxy或alikePost检查两者的http头,并精确显示每个头使用的URL。我怀疑RestTemplate只是对您已经编码的字符串进行URL编码,您应该向它传递一个未编码的参数。“所以我得到了双重编码?”孔基本上是这样<代码>RestTemplate
对给定给它的任何字符串URL进行编码。Apache的fluent API没有。它对字符串进行原始处理,并假设是您自己做的。感谢您前几天对Jackson问题的回答-反序列化功能。展开单个值数组的工作非常有魅力!如果你想离开硅谷回到欧洲,请告诉我,我们可以给你一个非常有吸引力的报价(我是首席技术官,我们资金充足)。我每天有50%的时间都在编码——显然很糟糕@你真慷慨。如果您愿意,请通过LinkedIn与我联系。(我来自蒙特利尔:p)
Professeur%2Bdes%2B%25C3%25A9coles
Professeur+des+%C3%A9coles