将多个参数传递给rest API - Spring

Posted

技术标签:

【中文标题】将多个参数传递给rest API - Spring【英文标题】:Pass multiple parameters to rest API - Spring 【发布时间】:2016-10-28 05:00:46 【问题描述】:

我想弄清楚是否可以将 JSON 对象传递给 rest API,或者将多个参数传递给该 API?以及如何在 Spring 中读取这些参数?让我们假设 url 看起来像下面的例子:

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

像下面的 url 那样传递 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 参数和其他参数,如 name 等......

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

【问题讨论】:

注解@RequestBody 并将对象作为正文传递呢? 您有什么特别的理由想要这样做吗?您应该能够从与实体匹配的请求中获取对象。 对不起,如果示例不准确,这只是一个概念证明,我希望能够根据搜索条件从数据库中获取建议项目列表。我将有一个调用其余 API 并传递参数的小部件。但我目前正试图专注于后端部分 【参考方案1】:

(1) 是否可以像 Ex.2 那样将 JSON 对象传递给 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
     ]
 ]

将其作为POST 发送,并在请求正文中而不是在URL 中使用JSON 数据,并指定application/json 的内容类型。

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

【讨论】:

谢谢@Andreas,它有效:) 但我还有一些问题吗?如果我们有一个复杂的参数结构怎么办? ** "A": [ "B": 37181, "timestamp": 1160100436, "categories": [ "categoryID": 2653, "timestamp": 1158555774 , "categoryID": 4453, "timestamp": 1158555774 ] ] ** 您不要在GET 中发送类似的内容,而是使用POST,并在有效负载中包含JSON,指定内容类型为application/json 感谢 Andreas 的上次更新,是否可以使用 javascript 创建 POST,因为我不想使用表单来使用这个 REST API,我希望 JavaScript 来使用它。 是的。我建议你做一个网络搜索。我还建议使用诸如jQuery 之类的库来简化操作。 @jolumg 有些人没有读到HTTP definition of the POST method:“POST方法请求目标资源处理根据资源的自己的特定语义"包含在请求中的表示。当然,最常见的语义是资源创建某些东西,但是 process 更通用,可以表示其他东西,例如使用提供的数据运行信用检查。 GET 是不合适的方法。【参考方案2】:

您可以在 url 中传递多个参数,例如

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

为了得到这个查询字段,你可以使用 map 之类的

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

【讨论】:

这确实帮助我创建了一个带有动态 URL 参数的 GET 服务。谢谢@Om Sharma【参考方案3】:

可以给出多个参数,如下所示,

    @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

【讨论】:

【参考方案4】:

是的,可以在 URL 中传递 JSON 对象

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

【讨论】:

以上是关于将多个参数传递给rest API - Spring的主要内容,如果未能解决你的问题,请参考以下文章

我不能将多个参数传递给 ASP Web API

将多个参数传递给 Web API GET 方法

将多个参数传递给后端 API reactjs

JavaScript/jQuery:将多个参数传递给 API 中的 POST 请求

我应该如何将多个参数传递给 ASP.Net Web API GET?

如何将参数传递给任务队列?