Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApacheHTTP客户端和SpringRESTTemplate之间的差异_Java_Spring_Apache Httpclient 4.x_Resttemplate - Fatal编程技术网

Java ApacheHTTP客户端和SpringRESTTemplate之间的差异

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

我正在调用GoogleTranslateAPI,一个是通过ApacheHTTP客户端,另一个是通过Spring的RestTemplate,并得到不同的结果。两者获取的URL完全相同:

我想把“科尔教授”从法语翻译成英语

使用的URL是(为了可读性,分成两行):

阿帕奇:

@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