【问题标题】:Pass multiple parameters to rest API - Spring将多个参数传递给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 并传递参数的小部件。但我目前正试图专注于后端部分

标签: java json spring rest spring-mvc


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 1970-01-01
      • 2017-06-04
      • 2018-05-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多