使用Spring MVC在REST HTTP GET请求中传递JSON对象

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)

Bon*_*ond 1

首先创建一个请求 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)