Передать несколько параметров в REST API-Spring

Я пытаюсь выяснить, можно ли передать объект JSON в REST API или передать несколько параметров этому API ? А как читать эти параметры весной ? Предположим, что url-адрес выглядит как приведенные ниже примеры:

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

действительно ли передавать объект JSON, как в url-адресе ниже ?

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

вопросы:

1) Можно ли передать объект JSON в url-адрес, как в Бывший.2?

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;
        }
    }

3 ответов


(1) Можно ли передать объект JSON в url-адрес, как в Ex.2?

нет, потому что http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"} не является допустимым URL.

если вы хотите сделать это спокойным способом, используйте 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?

просто добавьте два параметра запроса и укажите правильный путь.

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

обновление (из комментариев)

Что делать, если у нас сложная структура параметров ?

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

отправить как POST С данными JSON в теле запроса, а не в URL-адресе, и укажите тип контента application/json.

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

вы можете передать несколько параметров в url, как

http://localhost:2000/custom?бренд=dell & limit=20 & price=20000 & sort=asc

и для того , чтобы получить эти поля запроса, вы можете использовать map like

    @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();
    }

Да, возможно передать объект JSON в URL

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