我正在拨打谷歌翻译API,一个通过Apache HTTP客户端,另一个通过Spring的RestTemplate,并获得不同的结果.两者都获得完全相同的URL:
我想将"Professeurdesécoles"从法语翻译成英语.
使用的URL是(为了便于阅读,分为两行):
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); }
返回(更正):
{"data":{"translations":[{"translatedText":"School teacher" }]}}
@Test public void spring() { RestTemplate template = new RestTemplate(); String response = template.getForObject(URL, String.class); System.out.println(response); }
退货(不确定):
{"data":{"translations":[{"translatedText":"教授+ +%C3%A9coles" }}}}
我在RestTemplate HTTP标头配置中遗漏了什么吗?
RestTemplate
接受String
URL的方法执行URL编码.
对于每个HTTP方法,有三种变体:两个接受URI模板字符串和URI变量(数组或映射),而第三个接受URI.请注意,对于URI模板,假设编码是必要的,例如
restTemplate.getForObject("http://example.com/hotel list")
变为"http://example.com/hotel%20list"
.这也意味着如果URI模板或URI变量已经被编码,则将发生双重编码,例如http://example.com/hotel%20list
变为http://example.com/hotel%2520list
).
据推测,您提供了以下String
作为第一个参数
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,请考虑使用
UriComponentsBuilder
.
而不是使用接受String
URL的重载,自己构造一个URI并使用它.
Apache的HttpComponents Fluent API没有指定行为,但似乎String值按原样使用.