22

Jersey / Jacksonを使用してRESTAPIを作成しましたが、うまく機能します。JSONとして受信するPOJOに加えて、文字列トークンを受信するようにPOSTメソッドを調整したいと思います。私は次のように私の方法の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();
    }

}

どんな助けでも大歓迎です。

4

2 に答える 2

40

これはJAX-RSの動作方法ではありません。POSTリクエストの本文は、注釈付きリソースメソッドの最初の引数(この場合は引数)にマーシャリングされますUser。これを回避するためのいくつかのオプションがあります。

  1. Userオブジェクトとトークンの両方を含むラッパーオブジェクトを作成します。クライアントとサーバー間でそれをやり取りします。
  2. URLのクエリパラメータとしてトークンを指定し、サーバー側でとしてトークンにアクセスします@QueryParam
  3. トークンをヘッダーパラメータとして追加し、サーバー側でとしてアクセスします@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);
    // ...
}
于 2012-12-28T20:53:38.527 に答える
0

Jersey 1.xを使用している場合、最善のアプローチは、複数のオブジェクトを @FormParamとして投稿することです。

少なくとも2つの利点:

  1. 複数のパラメーターを投稿するためにラッパーオブジェクトを使用する必要はありません
  2. パラメータは、URLではなく本文内で送信されます(@QueryParamおよび@PathParamの場合のように)

この例を確認してください。

クライアント:(純粋なJava):

public Response testPost(String param1, String param2) {
    // Build the request string in this format:
    // String request = "param1=1&param2=2";
    String request = "param1=" + param1+ "&param2=" + param2;
    WebClient client = WebClient.create(...);
    return client.path(CONTROLLER_BASE_URI + "/test")
            .post(request);
}

サーバ:

@Path("/test")
@POST
@Produces(MediaType.APPLICATION_JSON)
public void test(@FormParam("param1") String param1, @FormParam("param2") String param2) {
    ...
}
于 2017-01-12T08:41:58.620 に答える