【发布时间】:2015-12-19 22:47:31
【问题描述】:
我正在调用 Google Translate API,一个是通过 Apache HTTP 客户端,另一个是通过 Spring 的 RestTemplate,得到不同的结果。两者都在获取完全相同的 URL:
我想将“Professeur des écoles”从法语翻译成英语。
使用的网址是(为了便于阅读,分成两行):
private static String URL = "https://www.googleapis.com/language/translate/v2?
key=AIzaSyBNv1lOS...&source=fr&target=en&q=Professeur+des+%C3%A9coles";
阿帕奇:
@Test
public void apache() throws IOException {
String response = Request.Get(URL).execute().returnContent().asString();
System.out.println(response);
}
返回(正确):
{ “数据”: { “翻译”:[ { "translatedText": "学校老师" } ] } }
@Test
public void spring() {
RestTemplate template = new RestTemplate();
String response = template.getForObject(URL, String.class);
System.out.println(response);
}
返回(不正确):
{ “数据”: { “翻译”:[ { "translatedText": "Professor + of +% C3% A9coles" } ] } }
我是否在 RestTemplate HTTP 标头配置中遗漏了什么?
【问题讨论】:
-
首先要做的是弄清楚每个客户端在请求中究竟发送了什么。有不同的方法可以做到这一点 - 我要做的是使用 netcat 在你的机器上打开一个监听套接字,然后更改为 URL 使其指向 localhost - netcat 然后将逐字打印出 HTTP 请求。
-
我的猜测是 Spring 客户端正在对编码的 'é' 字符做一些时髦的事情。当短语只有 ASCII 字符时它是否正常工作?
-
是的 - 简单的 ASCII 对两者都适用 - 这与编码有关。
-
检查两者的 http 标头,可以使用wireshark 或膜监视器代理或类似方法
-
准确发布每个网址使用的网址。我怀疑 RestTemplate 只是对您已经编码的字符串进行 URL 编码,您应该将其传递给未编码的参数。
标签: java spring apache-httpclient-4.x resttemplate