Jersey/Jacksonを使用してREST APIを作成しましたが、うまく機能します。 POSTメソッドを調整して、JSONとして受信しているPOJOに加えて文字列トークンを受信します。私のメソッドの1つを次のように調整しました。
@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を出力します。投稿リクエストを送信するために作成したクライアントコードは次のとおりです。
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
引数に)。取得するオプションがいくつかあります。この周り:
@QueryParam
としてアクセスします。@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);
// ...
}
例-オプション
クライアント:
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);
// ...
}
Jersey 1.xを使用している場合、最良のアプローチは@ FormParamとして複数のオブジェクトを投稿することです
少なくとも2つの利点:
この例を確認してください:
クライアント:(純粋なJava):
public Response testPost(String param1, String param2) {
// Build the request string in this format:
// String request = "param1=1¶m2=2";
String request = "param1=" + param1+ "¶m2=" + param2;
WebClient client = WebClient.create(...);
return client.path(CONTROLLER_BASE_URI + "/test")
.post(request);
}
Server:
@Path("/test")
@POST
@Produces(MediaType.APPLICATION_JSON)
public void test(@FormParam("param1") String param1, @FormParam("param2") String param2) {
...
}