将多个参数传递给休息 API - 弹簧

2022-08-31 22:19:24

我试图弄清楚是否有可能将JSON对象传递给休息API,或者将多个参数传递给该API?如何在春季阅读这些参数?让我们假设url看起来像下面的例子:

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

像下面的网址那样传递JSON对象是否有效?

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

问题:

1) 是否可以像 Ex.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参数和其他参数,如名称等....

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

答案 1

(1) 是否可以像 Ex.2 中那样将 JSON 对象传递到 url?

否,因为 不是有效的 URL。http://localhost:8080/api/v1/mno/objectKey/{"id":1, "name":"Saif"}

如果你想以 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中传递和解析参数?

只需添加两个请求参数,并给出正确的路径。

@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
    } ]
} ]

将其作为 与请求正文中(而不是 URL)中的 JSON 数据一起发送,并指定内容类型 。POSTapplication/json

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

答案 2

你可以在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();
    }