web-dev-qa-db-ja.com

Spring RestTemplate:GETリクエストで配列/文字列のリストを送信する

文字列の配列/リストをSpringRestTemplateを介してRESTサーバーに送信しようとしています。

これは私のAndroid側にあります:

        private List<String> articleids = new ArrayList<>();
        articleids.add("563e5aeb0eab252dd4368ab7");
        articleids.add("563f2dbd9bb0152bb0ea058e");         

        final String url = "https://10.0.3.2:5000/getsubscribedarticles";

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
                .queryParam("articleids", articleids);
        Java.net.URI builtUrl = builder.build().encode().toUri();
        Log.e("builtUrl", builtUrl.toString());

BuiltUrlは次のとおりです。 https://10.0.3.2:5000/getsubscribedarticles?articleids=%5B563e5aeb0eab252dd4368ab7,%20563f2dbd9bb0152bb0ea058e%5D

サーバー側:

 @RequestMapping(value = "/getsubscribedarticles", method = RequestMethod.GET)
public List<Posts> getSubscribedPostFeed(@RequestParam("articleids") List<String> articleids){
     for (String articleid : articleids {
        logger.info(" articleid : " + articleid);
    }
}

サーバーログ:

.13:11:35.370 [http-nio-8443-exec-5] INFO c.f.s.i.ServiceGatewayImpl-articleid:[563e5aeb0eab252dd4368ab7

.13:11:35.370 [http-nio-8443-exec-5] INFO c.f.s.i.ServiceGatewayImpl-articleid:563f2dbd9bb0152bb0ea058e]

リストの最初の項目に「[」、最後の項目に「]」を含めるべきではないため、私が見ることができるのは間違っています。

私はこのスレッドを読みました Spring RestTemplateを使用してListまたはString配列をgetForObjectに渡す方法 しかし、実際には質問に答えていません。

選択した回答はPOSTリクエストを発行しますが、GETリクエストを実行したいのですが、リストを保持するために追加のオブジェクトが必要であり、追加のオブジェクトを作成したくない場合はSpringRestTemplateでネイティブにそれを行うことができます。

8
Simon

正しいURLは次のようになると思います。

_https://10.0.3.2:5000/getsubscribedarticles?articleids[]=123&articleids[]=456&articleids[]=789
_

public UriComponentsBuilder queryParam(String name, Object... values)のコードをざっと見た後、次のようにUriComponentsBuilderを使用して解決します。

_UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
    .queryParam("articleids[]", articleids.toArray(new String[0]));
_

2番目のパラメータはarrayですが、オブジェクト/コレクションではないことが重要です。

12
Ralph

Java 8を使用すると、これは私にとってはうまくいきました:

UriComponentsBuilder builder = fromHttpUrl(url);
builder.queryParam("articleids", String.join(",", articleids));
URI uri = builder.build().encode().toUri();

次のようなURLを形成します。

https://10.0.3.2:5000/getsubscribedarticles?articleids=123,456,789
9
userab

あなたはすべて正しいことをしました。 []なしで呼び出す必要があります。

.../getsubscribedarticles/articleids=foo,bar,42で呼び出すだけです

これをSpringBoot 1.2.6でテストしたところ、次のように動作します。

1
d0x

彼の提案をしてくれたdOxに感謝します-私はPathVariableでこれを解決することができました-私はAndroid用のURLにリストを設定しました:

    final String url = "https://10.0.3.2:5000/getsubscribedarticles/"+new ArrayList<>(articleids);

私の残りのサーバーの場合:

        @RequestMapping(value = "/getsubscribedarticles/[{articleids}]", method = RequestMethod.GET)
public List<Posts> getSubscribedPostFeed(@PathVariable String[] articleids){

}
0
Simon