在Jackson / Jersey JAVA上发布带有多个参数JSON和String的请求 [英] post request with multiple parameters JSON and String on Jackson/Jersey JAVA

查看:209
本文介绍了在Jackson / Jersey JAVA上发布带有多个参数JSON和String的请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Jersey / Jackson创建了一个休息api,效果很好。我想调整我的POST方法以接收除了作为JSON接收的POJO之外的字符串标记。我已经调整了我的一个方法:

I've created a rest api using Jersey/Jackson and it works well. I want to adjust my POST methods to receive a string token in addition to the POJO they are receiving as JSON. I've adjusted one of my methods like so:

@POST
@Path("/user")
@Consumes(MediaType.APPLICATION_JSON)
public Response createObject(User o, String token) {
    System.out.println("token: " + token);
    String password = Tools.encryptPassword(o.getPassword());
    o.setPassword(password);
    String response = DAL.upsert(o);
    return Response.status(201).entity(response).build();

}

我想调用该方法,但无论出于何种原因令牌无论我尝试什么,打印到null。这是我写的发送邮件请求的客户端代码:

I want to call that method, but for whatever reason token prints to null no matter what I try. Here is the client code I've written to send the post request:

public String update() {

    try {
        com.sun.jersey.api.client.Client daclient = com.sun.jersey.api.client.Client
                .create();
        WebResource webResource = daclient
                .resource("http://localhost:8080/PhizzleAPI/rest/post/user");

        User c = new User(id, client, permission, reseller, type, username,
                password, name, email, active, createddate,
                lastmodifieddate, token, tokentimestamp);
        JSONObject j = new JSONObject(c);
        ObjectMapper mapper = new ObjectMapper();

        String request = mapper.writeValueAsString(c) + "&{''token'':,''"
                + "dog" + "''}";
        System.out.println("request:" + request);
        ClientResponse response = webResource.type("application/json")
                .post(ClientResponse.class, request);
        if (response.getStatus() != 201) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }

        System.out.println("Output from Server .... \n");
        String output = response.getEntity(String.class);
        setId(UUID.fromString(output));
        System.out.println("output:" + output);
        return "" + output;
    } catch (UniformInterfaceException e) {
        return "failue: " + e.getMessage();
    } catch (ClientHandlerException e) {
        return "failue: " + e.getMessage();
    } catch (Exception e) {
        return "failure: " + e.getMessage();
    }

}

任何帮助都将不胜感激。

Any help would be greatly appreciated.

推荐答案

这不是JAX-RS的工作方式。 POST请求的主体将被封送到带注释的资源方法的第一个参数(在这种情况下,进入 User 参数)。你有两个选择来解决这个问题:

This is not the way JAX-RS works. The body of your POST request will get marshaled to the first argument of your annotated resource method (in this case, into the User argument). You have a couple options to get around this:


  1. 创建一个包含User对象和令牌的包装器对象。在客户端和服务器之间来回发送。

  2. 在您的URL上将令牌指定为查询参数,并在服务器端以 @QueryParam <访问它/ code>。

  3. 将标记添加为标头参数,并在服务器端以 @HeaderParam 的形式访问它。

  1. Create a wrapper object containing both a User object and token. Send that back and forth between your client and server.
  2. Specify the token as a query parameter on your URL and access it on the server side as a @QueryParam.
  3. Add the token as a header parameter and access it on the server side as a @HeaderParam.






示例 - 选项1

class UserTokenContainer implements Serializable {
    private User user;
    private String token;

    // Constructors, getters/setters
}

示例 - 选项2

客户

WebResource webResource = client.
    resource("http://localhost:8080/PhizzleAPI/rest/post/user?token=mytoken");

服务器

@POST
Path("/user")
@Consumes(MediaType.APPLICATION_JSON)
public Response createObject(@QueryParam("token") String token, User o) {
    System.out.println("token: " + token);
    // ...
}

示例 - 选项3

客户

ClientResponse response = webResource
    .type("application/json")
    .header("Token", token)
    .post(ClientResponse.class, request);

服务器

@POST
Path("/user")
@Consumes(MediaType.APPLICATION_JSON)
public Response createObject(@HeaderParam("token") String token, User o) {
    System.out.println("token: " + token);
    // ...
}

这篇关于在Jackson / Jersey JAVA上发布带有多个参数JSON和String的请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆