it-swarm.com.de

postanforderung mit mehreren Parametern JSON und String auf Jackson/Jersey JAVA

Ich habe ein Rest-API mit Jersey/Jackson erstellt und es funktioniert gut. Ich möchte meine POST - Methoden anpassen, um zusätzlich zu dem POJO, das sie als JSON empfangen, ein Zeichenfolgetoken zu erhalten. Ich habe eine meiner Methoden so angepasst: 

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

}

Ich möchte diese Methode aufrufen, aber aus irgendeinem Grund wird der Token auf null gesetzt, egal was ich versuche. Hier ist der Client-Code, den ich geschrieben habe, um die Post-Anfrage zu senden: 

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

}

Jede Hilfe wäre sehr dankbar. 

22
sgoldberg

So funktioniert JAX-RS nicht. Der Rumpf Ihrer POST - Anforderung wird mit dem ersten Argument Ihrer kommentierten Ressourcenmethode gemarshallt (in diesem Fall in das Argument User). Sie haben ein paar Möglichkeiten, dies zu umgehen:

  1. Erstellen Sie ein Wrapper-Objekt, das ein Benutzerobjekt und ein Token enthält. Senden Sie das zwischen Client und Server hin und her.
  2. Geben Sie das Token als Abfrageparameter in Ihrer URL an und greifen Sie serverseitig als @QueryParam darauf zu.
  3. Fügen Sie das Token als Header-Parameter hinzu und greifen Sie serverseitig als @HeaderParam darauf zu.

Beispiel - Option 1

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

    // Constructors, getters/setters
}

Beispiel - Option 2

Klient:

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

Server:

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

Beispiel - Option 3

Klient:

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

Server:

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

Falls Sie Jersey 1.x verwenden, empfiehlt es sich, mehrere Objekte als @FormParamzu posten.

Mindestens zwei Vorteile:

  1. Sie müssen kein Wrapper-Objekt verwenden, um mehrere Parameter bereitzustellen
  2. Die Parameter werden innerhalb des Hauptteils und nicht in der URL gesendet (wie bei@QueryParamund@PathParam).

Überprüfen Sie dieses Beispiel: 

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

Server:

@Path("/test")
@POST
@Produces(MediaType.APPLICATION_JSON)
public void test(@FormParam("param1") String param1, @FormParam("param2") String param2) {
    ...
}
0
Naor Bar