TPP*_*PPZ 5 java rest spring json spring-mvc
根据这个REST模型以及我认为对REST的共识:每个REST 检索都应该作为HTTP GET请求执行. 现在的问题是如何将复杂的JSON对象作为Spring MVC的GET请求中的参数处理. 还有另一个共识,我发现说"使用POST进行检索!" 仅仅因为"大公司这样做!",但我被要求尝试坚持"REST级别2规则".
第一个问题:我想做一些有意义的事吗?
我想通过GET请求发送JSON对象的数组/列表/集合,在Java中使用Spring MVC. 我无法弄清楚我的尝试有什么问题,我试图添加/删除双引号,使用URL参数,但我无法实现这一目标.
以下代码有什么问题?代码片段来自MVC控制器.
@RequestMapping(
value = "/parseJsonDataStructures",
params = {
"language",
"jsonBeanObject"
}, method = RequestMethod.GET, headers = HttpHeaders.ACCEPT + "=" + MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public HttpEntity<ParsedRequestOutputObject> parseJsonDataStructures(
@RequestParam String language,
@RequestParam CustomJsonBeanObject[] customJsonBeanObjects){
try {
ParsedRequestOutputObject responseFullData = customJsonBeanObjectService.parseJsonDataStructures(customJsonBeanObjects, language);
return new ResponseEntity<>(responseFullData, HttpStatus.OK);
} catch (Exception e) {
// TODO
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了多种方法来构建URL请求(总是得到HTTP代码400 Bad Request),这是一个例子:
http://[...]/parseJsonDataStructures?language=en&jsonBeanObject={"doubleObject":10, "enumObject":"enumContent", "stringObject":"stringContent"}
Run Code Online (Sandbox Code Playgroud)
类型的JSON对象变量ar:
我假设我可以jsonBeanObject
一个接一个地传递多个参数.
在jsonBeanObject
的Java bean是:
public class CustomJsonBeanObject {
private Double doubleObject;
private CustomEnum enumObject;
private String stringObject;
/**
* Factory method with validated input.
*
* @param doubleObject
* @param enumObject
* @param stringObject
* @return
*/
public static CustomJsonBeanObject getNewValidatedInstance(Double doubleObject, CustomEnum enumObject, String stringObject) {
return new CustomJsonBeanObject
(
doubleObject ,
enumObject ,
stringObject
);
}
private CustomJsonBeanObject(Double doubleObject, CustomEnum enumObject, String stringObject) {
this.doubleObject = doubleObject;
this.enumObject = enumObject;
this.stringObject = stringObject;
}
public CustomJsonBeanObject() {}
// getter setter stuff
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
Run Code Online (Sandbox Code Playgroud)
首先创建一个请求 bean,它应该封装您期望作为请求一部分的参数。将其称为SomeRequest
第二个在控制器中使用@RequestBody
而不是@RequestParam
@ResponseBody public HttpEntity<ParsedRequestOutputObject> parseJsonDataStructures(@RequestBody SomeRequest someRequest) { ... }
Run Code Online (Sandbox Code Playgroud)
第三次用作RestTemplate
客户端来调用 REST 服务。下面的示例代码 -
SomeRequest someRequest = new SomeRequest();
// set the properties on someRequest
Map<String, String> userService = new HashMap<String, String>();
RestTemplate rest = new RestTemplate();
String url = endPoint + "/parseJsonDataStructures";
ResponseEntity<SomeResponse> response = rest.getForEntity(url, someRequest,
SomeResponse.class, userService);
SomeResponse resp = response.getBody();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
25715 次 |
最近记录: |