2017-06-11 4 views
0

Ich habe gerade mit der Verwendung von Drowwizard und wollen JSON Daten zu POST-Methode senden.Post json zu externen api

@POST 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public String newPost(){ 
    Client client = ClientBuilder.newClient(); 

    String input = "{"version":"v1","buildTime":"2017-06-06"}"; 

    //call external api with json_input 


    return result; 
} 

Also ich möchte die Eingabe (RAW JSON) zu externen API.

client.target("https://path_to_external_api").request().get(String.class); funktioniert gut für GET-Methode verwenden, aber nicht sicher, wie POST

Fragen oder Anregungen/Vorschläge geschätzt zu implementieren.

Antwort

0

Für die Referenz, endete ich mit Jersey Client wie folgt.

Liste der Importe:

import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.client.WebTarget; 

den Client innerhalb @POST Methode in meiner Ressource mit:

Client client = ClientBuilder.newClient(); 

    WebTarget tar = client.target("https://path_to_external_api"); 
    Response res = tar.request().accept(MediaType.APPLICATION_JSON) 
      .post(Entity.entity(json_input, MediaType.APPLICATION_JSON), Response.class); 
    return res; 
0

Ich würde gerne Modelle definieren, während MediaType.APPLICATION_JSON verwenden.

Probe

InputPOJO { 
    String version; 
    Long buildTime; 
    // ...getters and setters here 
} 

gefolgt von Response Entität mit dem Response-Objekt als (einschließlich Importe aus Gründen der Klarheit) zurückzukehren -

import javax.ws.rs.POST; 
import javax.ws.rs.Produces; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response;  


@POST 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
@Path("/xyz") 
public Response newPost(InputPOJO inputPOJO) { 
    String output = "Success!" + inputPOJO.getVersion(); 
    return Response.status(200).entity(output).build(); 
} 
+0

Die Ich denke, ist für die Umsetzung der POST-Methode selbst, aber ich versuche zu schlagen eine andere (externe) API innerhalb der POST-Methode (wie in meinem ursprünglichen Post kommentiert). Könntest du bitte darauf hinweisen, wie du die externe API in meiner Post-Methode anstößt? Der Grund, warum ich das Modell nicht definiere, ist auch die Eingabe, die JSON ändern könnte (sowieso muss ich mit rohen JSON umgehen). Vielen Dank – Mahyar

0

eine Modifikation des von @nullpointer definierten Service-Anwendung:

@Path("/testpostjson") 
public class MyPostResource { 

    public MyPostResource() { 

    }   
    @POST 
    @Produces(MediaType.APPLICATION_JSON) 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response newPost(InputPOJO inputPOJO) { 
     String output = "Success! " + inputPOJO.getVersion() +" "+ inputPOJO.getBuildTime(); 
     return Response.status(200).entity(output).build(); 
    } 
} 

Ich habe diesen Client erstellt, den Sie verwenden können:

@Produces(MediaType.TEXT_PLAIN) 
@Path("/client") 
public class Client2Post { 

    private Client client; 

    public Client2Post(Client client) { 
     this.client = client; 
    } 

    @Path("/test") 
    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    public String newPost(){ 

     String input = "{\"version\":\"v1\",\"buildTime\":\"2017-06-06\"}"; 

     //call external api with json_input 
     final Invocation.Builder request = client.target("http://localhost:8080/testpostjson").request(); 
     final Response result = request.post(Entity.entity(input, MediaType.APPLICATION_JSON_TYPE));  

     return result.readEntity(String.class); 

    } 
} 

Denken Sie auch daran, das Trikot-Client in der Konfigurationsdatei zu konfigurieren:

@Valid 
@NotNull 
private JerseyClientConfiguration jerseyClient = new JerseyClientConfiguration(); 

@JsonProperty("jerseyClient") 
public JerseyClientConfiguration getJerseyClientConfiguration() { 
    return jerseyClient; 
} 

Und die erstellten Ressourcen in Ihrer Anwendungsdatei registrieren.