如何在 spring-mvc 中为 REST 查询提供对象列表?

Posted

技术标签:

【中文标题】如何在 spring-mvc 中为 REST 查询提供对象列表?【英文标题】:How to provide a list of objects for a REST query in spring-mvc? 【发布时间】:2015-03-22 13:08:53 【问题描述】:

我想在spring-mvc 中创建一个 REST-GET 控制器,它接受一个对象列表,例如 10 个 id,如下所示:

@RestController
public class MyRest 
   @RequestMapping(method = RequestMethod.GET)
   public Object test(@RequestParam value="id" required=false) List<Integer> ids) 
    Sysout(ids);
  

无论如何,当我调用它时,我必须多次重复 id 参数:

localhost:8080/app?id=1&id=2&id=3&...

可以将参数更改为某种列表吗?例如

 app?id=1,2,3,4,5

如果是,这是否可取?从客户的角度来看,什么更好?

【问题讨论】:

两者都可以,但不推荐任何一种。如果您想汇总这么多信息,请以 json/xml 格式发送一些信息。因此,对于您的问题的答案,请使用第一种格式 - 从用户的角度来看,它更具可读性。 在***.com/questions/2602043/…上讨论了相同的要求 【参考方案1】:

控制器:

 public @ResponseBody String getInfos(HttpServletRequest request,
                @RequestParam @DateTimeFormat( @RequestParam List<Long> ids) ...

请求:

http://localhost:8080/test/api?ids=1,2,3

【讨论】:

【参考方案2】:

您可以提供对象列表作为请求参数来休息服务。这里是示例

@RequestMapping(value = "/animals, method = RequestMethod.GET)
   public void test(@RequestParam(value="animalsNames[]") String[] animalsNames) 
    Sysout(animalsNames);
  

你的请求看起来像

http://localhost:8080/appname/animals?animalsNames[]=dog,horse  
HTTP Method type : GET

【讨论】:

您能否提供使用自定义对象而不是字符串的示例?例如里面有两个变量的对象?【参考方案3】:

最好使用带有 JSON 或 XML 的 POST 消息作为请求正文。 因为你永远不知道会传递多少个 id。

@RestController
public class MyRest 
   @RequestMapping(method = RequestMethod.POST)
   public Object test(@RequestBody IDRequest request) 
    Sysout(ids);
  
  public static final class IDRequest 
    List<Integer> ids;
    <!-- getter/setters--->
  

请求将是某种 JSON 或 XML 格式

"ids":[1,2,3,4,5,6,7,8,9]

【讨论】:

我不同意。修改系统状态时使用 POST。在这种情况下,他只想取回数据,所以 GET 比 POST 好,甚至重复 id 参数

以上是关于如何在 spring-mvc 中为 REST 查询提供对象列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenAPI (Swagger) 中为同一路径定义不同的查询参数?

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

如何在scala akka(spray)中为rest服务编写测试用例

如何在 Django Rest Framework 的 REST API 中为数组数据编写序列化程序?

请求令牌时如何在 Azure 存储 Blob 中为 REST 请求指定范围? [AZURE-BLOB][REST API]

如何在url中为rest服务的get方法传递逗号分隔的参数