0

我使用 Spring androidRestTemplate对 Youtube API 执行 GET 请求,如下所示:

// build rest template
RestTemplate restTemplate = new RestTemplate();

GsonHttpMessageConverter jsonConverter = new GsonHttpMessageConverter();
FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
final List<HttpMessageConverter<?>> listHttpMessageConverters = restTemplate.getMessageConverters();

listHttpMessageConverters.add(jsonConverter);
listHttpMessageConverters.add(formHttpMessageConverter);
listHttpMessageConverters.add(stringHttpMessageConverter);
restTemplate.setMessageConverters(listHttpMessageConverters);

Uri.Builder uriBuilder = Uri.parse(https://www.googleapis.com/youtube/v3/channels).buildUpon();
uriBuilder.appendQueryParameter("key", API_KEY);
uriBuilder.appendQueryParameter("part", "id,snippet");
uriBuilder.appendQueryParameter("forUsername", channelName);

String url = uriBuilder.build().toString(); // this is right url
// like this:  https://www.googleapis.com/youtube/v3/channels?key=MY_KEY&part=id%2Csnippet&forUsername=cnn

MyEntity result =  restTemplate.getForObject(url, MyEntity.class);

从调试中,我可以看到RestTemplate执行错误的 url,我得到了400 bad request error

03-16 12:06:47.651: W/RestTemplate(24970): GET 请求“ https://www.googleapis.com/youtube/v3/channels?key=MY_KEY&part=id%252Csnippet&forUsername=cnn ”导致 400 (错误的请求); 调用错误处理程序

我不知道为什么RestTemplate要再次尝试对参数 url 进行编码,从id%2Csnippettoid%252Csnippet
有没有办法纠正它?

4

1 回答 1

4

碰巧RestTemplate#getForObject(..)期望 a 的方法String从给定的 URI 构建一个 URIString并在使用它之前对其进行编码。它使用自定义 Spring 类来执行此操作。(参见源代码。)

URI您可以通过从您的对象创建一个对象String并将其传递给该方法来解决此问题。

String url = uriBuilder.build().toString(); // this is right url
URI uri = new URI(url);
MyEntity result =  restTemplate.getForObject(uri, MyEntity.class);
于 2014-03-16T05:44:00.960 回答