当前位置:  开发笔记 > 编程语言 > 正文

Apache HTTP Client和Spring RestTemplate之间的区别

如何解决《ApacheHTTPClient和SpringRestTemplate之间的区别》经验,为你挑选了1个好方法。

我正在拨打谷歌翻译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标头配置中遗漏了什么吗?



1> Sotirios Del..:

RestTemplate接受StringURL的方法执行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.

而不是使用接受StringURL的重载,自己构造一个URI并使用它.


Apache的HttpComponents Fluent API没有指定行为,但似乎String值按原样使用.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有