gpt4 book ai didi

java - 在 Jackson/Jersey JAVA 上发布带有多个参数 JSON 和 String 的请求

转载 作者:IT老高 更新时间:2023-10-28 12:55:57 25 4
gpt4 key购买 nike

我使用 Jersey/Jackson 创建了一个 rest api,它运行良好。除了他们作为 JSON 接收的 POJO 之外,我想调整我的 POST 方法以接收字符串 token 。我已经像这样调整了我的一种方法:

@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();

}

我想调用该方法,但无论出于何种原因,无论我尝试什么,token 都会打印为 null。这是我编写的用于发送发布请求的客户端代码:

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();
}

}

任何帮助将不胜感激。

最佳答案

这不是 JAX-RS 的工作方式。 POST 请求的主体将被编码到带注释的资源方法的第一个参数(在本例中,为 User 参数)。你有几个选择来解决这个问题:

  1. 创建一个包含用户对象和 token 的包装对象。在客户端和服务器之间来回发送。
  2. 将 token 指定为 URL 上的查询参数,并在服务器端以 @QueryParam 的形式访问它。
  3. 将 token 添加为 header 参数,并在服务器端以 @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);
// ...
}

关于java - 在 Jackson/Jersey JAVA 上发布带有多个参数 JSON 和 String 的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14075422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com