web-dev-qa-db-ja.com

REST APIに複数のパラメーターを渡す-Spring

JSONオブジェクトをREST APIに渡すことができるかどうか、またはそのAPIに複数のパラメーターを渡すことができるかどうかを把握しようとしていますか?そして、これらのパラメータをSpringで読み取る方法は? URLが以下の例のように見えると仮定しましょう:

例1 http://localhost:8080/api/v1/mno/objectKey?id=1&name=saif

以下のURLのようなJSONオブジェクトを渡すことは有効ですか?

例2 http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"}

質問:

1)例2のようにJSONオブジェクトをURLに渡すことは可能ですか?

2)Ex.1のパラメーターをどのように渡して解析できますか?

目標を達成するためにいくつかの方法を記述しようとしましたが、適切な解決策が見つかりませんでしたか?

JSONオブジェクトを@RequestParamとして渡そうとしました

http://localhost:8080/api/v1/mno/objectKey?id=1予期しないエラーがありました(type=Unsupported Media Type, status=415). Content type 'null' not supported

http://localhost:8080/api/v1/mno/objectKey/id=1予期しないエラーがありました(type=Not Found, status=404). No message available

http://localhost:8080/api/v1/mno/objectKey/%7B%22id%22:1%7D予期しないエラーがありました(type=Not Found, status=404). No message available

@RequestMapping(value="mno/{objectKey}",
                method = RequestMethod.GET, 
                consumes="application/json")
    public List<Book> getBook4(@RequestParam ObjectKey objectKey) {
        ...
    }

JSONオブジェクトを@PathVariableとして渡そうとしました

@RequestMapping(value="ghi/{objectKey}",method = RequestMethod.GET)
    public List<Book> getBook2(@PathVariable ObjectKey objectKey) {
        ...         
    }

Idパラメーターやnameなどのその他のパラメーターを保持するためにこのオブジェクトを作成しました...

class ObjectKey{
        long id;
        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }
    }
14
Saif Masadeh

(1)例2のように、JSONオブジェクトをURLに渡すことは可能ですか?

いいえ、http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"}は有効なURLではないためです。

RESTfulな方法でやりたい場合は、http://localhost:8080/api/v1/mno/objectKey/1/Saifを使用し、メソッドを次のように定義します。

@RequestMapping(path = "/mno/objectKey/{id}/{name}", method = RequestMethod.GET)
public Book getBook(@PathVariable int id, @PathVariable String name) {
    // code here
}

(2)Ex.1のパラメーターをどのように渡して解析できますか?

2つのリクエストパラメータを追加し、正しいパスを指定するだけです。

@RequestMapping(path = "/mno/objectKey", method = RequestMethod.GET)
public Book getBook(@RequestParam int id, @RequestParam String name) {
    // code here
}

UPDATE(from comment)

複雑なパラメーター構造がある場合はどうでしょうか?

"A": [ {
    "B": 37181,
    "timestamp": 1160100436,
    "categories": [ {
        "categoryID": 2653,
        "timestamp": 1158555774
    }, {
        "categoryID": 4453,
        "timestamp": 1158555774
    } ]
} ]

URLではなくリクエスト本文にJSONデータを含むPOSTとして送信し、application/jsonのコンテンツタイプを指定します。

@RequestMapping(path = "/mno/objectKey", method = RequestMethod.POST, consumes = "application/json")
public Book getBook(@RequestBody ObjectKey objectKey) {
    // code here
}
43
Andreas

次のようなURLで複数のパラメータを渡すことができます

http:// localhost:2000/custom?brand = Dell&limit = 20&price = 20000&sort = asc

このクエリフィールドを取得するには、次のようなマップを使用できます

    @RequestMapping(method = RequestMethod.GET, value = "/custom")
    public String controllerMethod(@RequestParam Map<String, String> customQuery) {

        System.out.println("customQuery = brand " + customQuery.containsKey("brand"));
        System.out.println("customQuery = limit " + customQuery.containsKey("limit"));
        System.out.println("customQuery = price " + customQuery.containsKey("price"));
        System.out.println("customQuery = other " + customQuery.containsKey("other"));
        System.out.println("customQuery = sort " + customQuery.containsKey("sort"));

        return customQuery.toString();
    }
8
Om Sharma

はい、URLにJSONオブジェクトを渡すことができます

queryString = "{\"left\":\"" + params.get("left") + "}";
 httpRestTemplate.exchange(
                    Endpoint + "/A/B?query={queryString}",
                    HttpMethod.GET, entity, z.class, queryString);
0
techspl

以下のように複数のパラメーターを指定できます。

    @RequestMapping(value = "/mno/{objectKey}", method = RequestMethod.GET, produces = "application/json")
    public List<String> getBook(HttpServletRequest httpServletRequest, @PathVariable(name = "objectKey") String objectKey
      , @RequestParam(value = "id", defaultValue = "false")String id,@RequestParam(value = "name", defaultValue = "false") String name) throws Exception {
               //logic
}
0
Rohit Dubey