【问题标题】:Best way to build REST api for a search with operands JSON使用操作数 JSON 构建用于搜索的 REST api 的最佳方法
【发布时间】:2014-07-03 07:39:07
【问题描述】:

我正在尝试为我的应用程序构建一个 REST api。基础已经完成。但现在我需要一些帮助来搜索不同参数及其操作数。

假设我有一个这样的 JSON 字符串:

{"v00Datvon":"09-07-2014","v00Datbis":"09-07-2014","v00Saicode":{"saiCode":"SO02"}}

这些是我的“合同”域对象的值。

对于UI部分的搜索,您可以为两个日期选择一个操作数(大于或小于或等于)

所有参数(不包括操作数)都是通过 GET 和 Ajax 调用发送的。

Spring MVC 控制器如下所示:

    @RequestMapping(value = "/", method = RequestMethod.GET, headers = "Accept=application/json")
    public ResponseEntity<String> getContractsFromSearch(@RequestParam String allRequestParams, ModelMap model){
    //some stuff
    }

我正在寻找技术输入,如何以干净且良好的方式将操作数添加到 JSON 字符串和控制器。我不想破解一些糟糕的代码。 如果您需要更多输入,请发表评论。 谢谢!

更新 1。

GET 请求:

allRequestParams={"v00Datvon":"09-07-2014","v00Datbis":"09-07-2014","v00Saicode":{"saiCode":"SO02"}}

更新 2。

    {
  "dateFrom": {
    "dateFrom": "someDate",
    "operand": "less"
  },
  "dateTo": {
    "dateTo": "someDate",
    "operand": "greater"
  },
  "season": {
    "season": "someSeason",
    "operand": "equals"
  }
}

更新 3 反序列化:

public static Contract fromJsonToContract(String json) {
    return new JSONDeserializer<Contract>().use(Calendar.class, new CalendarTransformer("dd-MM-yyyy HH:mm")).use(null, Contract.class).deserialize(json);
}

【问题讨论】:

  • 您能否向我们展示一个GET 请求的示例? URL 中的参数是什么样的?
  • 目前我没有将操作数添加到参数中。我不确定以一种好的方式来做到这一点。
  • 还有其他建议吗?
  • 对日期使用 ISO-8601 编码。 GET URL 看起来找到了。
  • GET Url 工作正常。那不是问题。我需要一些帮助才能将操作数的参数添加到此 Url。以干净和好的方式。可能会有一些标准吗?谢谢

标签: java json spring rest spring-mvc


【解决方案1】:

首先根据您的控制器如何将 Map 作为 requestParam 传递,这是不可能的,您是否尝试过这个

 @RequestMapping(value = "/", method = RequestMethod.GET, headers = "Accept=application/json")
    public ResponseEntity<String> getContractsFromSearch(HttpServletRequest request, Object> allRequestParams, ModelMap model){
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements())
{
      String paramName =
(String)paramNames.nextElement();
      out.print(paramName);
}
    //some stuff
    }

【讨论】:

  • 地图工作正常。映射的输出如下所示:{dateFrom=02-07-2014, dateTo=02-07-2014, season=SO03} 但是您对使用您的解决方案将操作数添加到参数列表有什么建议吗?
  • 还有其他建议吗?
  • 在移动到控制器之前,放置一些过滤器逻辑,您可以轻松地附加操作数
  • 好的。但是json应该是什么样子的呢?就像有问题的更新2一样?或者有什么标准吗?
  • 是的,你可以更喜欢看起来有意义的 update2 json
【解决方案2】:

我认为您的 JSON 过于冗长:您有一个名为“dateFrom”的条目,其中有一个名为“dateFrom”的条目,请尽量保持简单和“扁平化”。这个选项怎么样?:

 {
  "dateFrom": "someDate",
  "operandFrom": "less",

  "dateTo": "someDate",
  "operandTo": "greater",

  "season": "someSeason",
  "operandSeason": "equals"

}

我知道按语义分组数据很诱人,但在 GET 请求中,您必须考虑处理参数的最佳方式。数据可以轻松转换为:

dateFrom=someDate&operandFrom=less&dateTo=someDate&operandTo=greater&season=someSeason&operandSeason=equals

或者只发送一个以 JSON 为值的参数:

q={"dateFrom": "someDate","operandFrom":"less","dateTo":"someDate","operandTo":"greater","season":"someSeason","operandSeason":"equals"}

但是你需要在你的控制器中解析它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2017-03-24
    • 2012-01-30
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多