Java 使用SpringMVC在RESTHTTPGET请求中传递JSON对象

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参数

根据这一点以及我认为关于REST的共识:每个REST检索都应该作为HTTP GET请求执行。 现在的问题是如何在SpringMVC的GET请求中将复杂的JSON对象作为参数处理。 我还发现另一个共识是“使用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
    }
}
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;
}
}