将多个参数传递给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的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript/jQuery:将多个参数传递给 API 中的 POST 请求