根据这个REST model以及我认为对REST的共识:每个REST 检索都应该作为HTTP GET请求执行。 现在的问题是如何将复杂的JSON对象视为使用Spring MVC的GET请求中的参数。 还有另一个共识我发现"使用POST进行检索!"只是因为"大公司这样做了!",但我被要求尝试坚持" REST 2级规则"。
第一个问题:我想做一些有意义的事情吗?
我希望通过GET请求发送JSON对象的数组/列表/集合,使用Spring MVC在Java中发送。 我无法弄清楚我的尝试有什么问题,我试图添加/删除双引号,使用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
}
}
我尝试了多种方法来构建URL请求(总是获取HTTP代码400 Bad Request),这是一个例子:
http://[...]/parseJsonDataStructures?language=en&jsonBeanObject={"doubleObject":10, "enumObject":"enumContent", "stringObject":"stringContent"}
类型为:
的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);
}
}
答案 0 :(得分:1)
首先创建一个请求bean,它应该封装您期望作为请求的一部分的参数。将其称为SomeRequest
控制器中的第二个使用@RequestBody
而不是@RequestParam
@ResponseBody public HttpEntity<ParsedRequestOutputObject> parseJsonDataStructures(@RequestBody SomeRequest someRequest) { ... }
第三次使用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();
答案 1 :(得分:1)
关于仅使用GET或POST的声明仅针对REST完全不正确。使用的HTTP方法取决于您正在执行的操作。对于检索,您应该使用GET,添加/创建POST,删除/删除DELETE,以及替换PUT。此外,要成为&#34; true&#34; REST应该只通过服务器响应提供的自行记录操作来更改状态(在HATEOAS上阅读)。大多数人不会做后者。
顺便说一下,我尝试搜索&#34; REST级别2&#34;关于床和龙与地下城和龙的网站也没有任何结果。我个人从来没有听说过它,所以它显然是如此新鲜,以至于没有很多网站在谈论它,或者它可能被称为别的东西。
关于如何发送JSON对象的问题,Spring MVC可以处理开箱即用的问题。您可以阅读它here,它使用@RequestBody
引入整个HTTP请求主体,然后使用您选择的JSON处理器对其进行解析。那里有很多代码示例描述了如何处理列表等。
答案 2 :(得分:0)
package com.lightaria.json;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.databind.ObjectMapper;
@RestController
public class StatusController {
@RequestMapping("/lkg.latest")
public MainStatus stat() throws IOException{
byte[] jsonData = Files.readAllBytes(Paths.get("/home/admin/StatusPage/Downloads/JSON/lkg-latest.json"));
ObjectMapper objectMapper =new ObjectMapper();
MainStatus stat1 = objectMapper.readValue(jsonData, MainStatus.class);
System.out.println("Status\n"+stat1);
return stat1;
}
}
我使用上面的方法来解析JSON文件并将其存储为JSON对象。可以通过URL轻松替换路径。希望它有所帮助。
不要忘记创建包含端口和各种其他配置的application.properties文件。对于ex - (要在端口8090上运行RESTful应用程序,application.properties文件应该具有 server.port = 8090 。