使用操作数JSON为搜索构建REST API的最佳方法

时间:2014-07-03 07:39:07

标签: java json spring rest spring-mvc

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

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

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

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

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

所有参数(没有操作数)都是根据GET和Ajax调用发送的。

Spring MVC Controller看起来像这样:

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

2 个答案:

答案 0 :(得分:0)

首先根据您的Controller如何将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
    }

答案 1 :(得分:0)

我认为你的JSON太冗长:你有一个名为&#34; dateFrom&#34;有一个名为&#34; dateFrom&#34;的条目,试着保持简单和平坦的#34;。这个选项怎么样?:

 {
  "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"}

但是,您需要在控制器中解析它。