8

我正在开发必须接收多个信息的 REST 服务。在这种情况下,两个对象和一个属性。

这是我正在测试 POST 请求的 javascript

    var user = {
        username: "admin",
        password: "admin"
    };
    var userToSubscribe = {
        username: "newuser",
        password: "newpassword",
        email: "user@1and1.es"
    };

    var openid = "myopenid";

    $.ajax({
        url: '/myportal/rest/subscribeUser.json',
        type: 'POST',
        dataType: 'json',
        contentType: 'application/json',
        mimeType: 'application/json',
        data: JSON.stringify({ user: user, userToSubscribe: userToSubscribe, openid: openid})    
    });

POST 请求:

    JSON


    openid
        "myopenid"

    user
        Object { username="admin", password="admin"}

    userToSubscribe
        Object { username="newuser", password="newpassword", email="user@1and1.es"}
    Source
    {"user":{"username":"admin","password":"admin"},"userToSubscribe":{"username":"newuser","password":"newpassword","email":"user@1and1.es"},"openid":"myopenid"}

以及处理 POST 的控制器:

    @RequestMapping(method=RequestMethod.POST, value="/subscribeUser.json")
public @ResponseBody Message subscribeUser(@RequestBody("user") User user, @RequestBody("userToSubscribe") User userToSubscribe, @RequestParam String openid){
    ...
}

错误是

POST subscribeUser.json 400 请求不正确 localhost:8080 990 B [::1]:8080

我究竟做错了什么?

谢谢

4

3 回答 3

12

请求正文将包含整个 JSON 内容。因此,当您想要映射 JSON 时,您只使用一个 RequestBody 注释参数。你将不得不做这样的事情:

public @ResponseBody Message subscribeUser(@RequestBody String str)
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(str);

然后使用映射器的 convertValue 方法从字符串中获取不同的对象。

JsonNode node = mapper.readTree(str);
User theUser = mapper.convertValue(node.get("user"), User.class);

对于其他对象也是如此

于 2013-10-30T08:56:32.360 回答
2

您不能@ModelAttribute在接受 JSON 的 RESTful 方法中使用 s。我相信正确的方法是使用@RequestBody,就像在此处所做的那样。您很可能需要将对象包装在某个包装类中,但我可能错了,因为我之前从未亲自尝试在一个请求中传递多个 JSON 对象。

也就是说,我认为如果您重新考虑您的 REST api,删除 JSON 参数并将它们作为 URI 路径的一部分传递(如果可能),那将是一个好主意。我建议通读这篇博文

于 2013-10-29T14:01:21.700 回答
0

您可以创建一个包含所有对象的 java bean(POJO),例如..

class JavaBean{
    private User user;
    private UserTOSubscribe  userToSubscribe;
    private Long openId;

    // getter and setter
}

并将这个 bean 传递给 Web 服务。所以网络服务看起来像..

@RequestMapping(method=RequestMethod.POST, value="/subscribeUser.json")
public @ResponseBody Message subscribeUser(@RequestBody JavaBean javaBean) {
    ...
}
于 2017-10-05T12:09:36.400 回答