Java 使用SpringMVC在RESTHTTPGET请求中传递JSON对象
根据这一点以及我认为关于REST的共识:每个REST检索都应该作为HTTP GET请求执行。 现在的问题是如何在SpringMVC的GET请求中将复杂的JSON对象作为参数处理。 我还发现另一个共识是“使用POST进行检索!”仅仅因为“大公司这样做!”,但是我被要求尝试遵守“REST级别2规则”。 第一个问题:我是否在尝试做一些有意义的事情 我想通过GET请求数组/列表/JSON对象集发送,使用Java和Spring MVC。 我无法找出我的尝试有什么问题,我尝试添加/删除双引号,使用URL参数,但我无法实现这一目标 以下代码有什么问题?代码段来自MVC控制器Java 使用SpringMVC在RESTHTTPGET请求中传递JSON对象,java,json,spring,rest,spring-mvc,Java,Json,Spring,Rest,Spring Mvc,根据这一点以及我认为关于REST的共识:每个REST检索都应该作为HTTP GET请求执行。 现在的问题是如何在SpringMVC的GET请求中将复杂的JSON对象作为参数处理。 我还发现另一个共识是“使用POST进行检索!”仅仅因为“大公司这样做!”,但是我被要求尝试遵守“REST级别2规则”。 第一个问题:我是否在尝试做一些有意义的事情 我想通过GET请求数组/列表/JSON对象集发送,使用Java和Spring MVC。 我无法找出我的尝试有什么问题,我尝试添加/删除双引号,使用URL参数
@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
}
}
JSON对象变量的类型为:
- Double(不是原语)
- 枚举
- 串
jsonBeanObject
参数
jsonBeanObject
javabean是:
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);
}
}
首先创建一个请求bean,它应该将您期望的参数封装为请求的一部分。将其称为
SomeRequest
控制器中的第二个命令使用@RequestBody
而不是@RequestParam
@ResponseBody public HttpEntity<ParsedRequestOutputObject> parseJsonDataStructures(@RequestBody SomeRequest someRequest) { ... }
您关于只使用GET或POST的声明完全不正确。使用的HTTP方法取决于您正在执行的操作。对于检索,应该使用GET、添加/创建POST、删除/删除delete和替换PUT。另外,为了“真实”REST,您应该只通过服务器响应提供的自我记录的操作来更改状态(请参阅)。大多数人不会做后者 顺便说一句,我试着搜索“休息2级”,但在关于床、地下城和龙的网站上也一无所获。我个人从未听说过它,所以它显然是如此新,以至于没有很多网站在谈论它,或者它可能被称为其他东西 关于如何发送JSON对象,SpringMVC可以直接处理。您可以阅读它,它使用
@RequestBody
拉入整个HTTP请求体,然后使用您选择的JSON处理器解析它。那里有大量的代码示例,描述如何处理列表等
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,你不会仅仅因为“大公司这样做!”,而是因为“rest level 2规则这么说!”?顺便说一句,谷歌搜索了“rest level 2”,只找到了床。正如我所写的:“我被要求尝试遵守“REST级别2规则”,也就是说,这不是一个选择:)你也可以添加CustomJSonBeanoObject的代码吗?完成后,我还补充说,运行URL请求时,我总是收到HTTP代码400的错误请求。感谢你指出“REST检索”。使用“请求”我的意思是“检索”是的,如果有人想通过REST检索某些内容,他们应该使用HTTP GET请求,而不是POST请求。我编辑了突出显示“检索”而不是“请求”的问题。好的,这是个好消息,谢谢:)现在我的问题是:有没有办法只将一些输入参数放入“对象包装器”中?您能否提供HTTP GET请求的URL示例?这样我就可以知道如何调用/测试它了。基本上,我不能假设使用我的REST服务的人也在使用Spring(RestTemplate等),当我试图在HTTP GET字符串中手动编写JSON对象时,我总是遇到一些关于URL编码(例如逗号)、引号或非引号等的问题。谢谢!
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();
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;
}
}