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

时间:2014-07-03 10:37:26

标签: java json spring rest spring-mvc

根据这个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
  • Double(不是原始的)
  • 枚举
  • 字符串

我假设我可以一个接一个地传递多个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);
    }
}

3 个答案:

答案 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