0

I use Spring android RestTemplate to execute GET request to Youtube API like this:

// 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);

From debug, I can see RestTemplate execute wrong url and I got 400 bad request error:

03-16 12:06:47.651: W/RestTemplate(24970): GET request for "https://www.googleapis.com/youtube/v3/channels?key=MY_KEY&part=id%252Csnippet&forUsername=cnn" resulted in 400 (Bad Request); invoking error handler

I have no idea why RestTemplate try to encode parameter url again, from id%2Csnippet to id%252Csnippet
Is there any way to correct it?

4

1 に答える 1

4

RestTemplate#getForObject(..)a を期待するメソッドがString、指定された URI から URI を作成し、Stringそれを使用する前にエンコードするというのはたまたまです。カスタム 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 に答える