我正在尝试为我的应用程序构建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);
}
答案 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"}
但是,您需要在控制器中解析它。