2013-04-29 18 views
21

Jestem nowa w Jersey. Muszę zaimplementować klienta z Jersey, aby przesłać dane za pomocą metody POST. Komenda curl jest:Jak przesłać dane za pomocą klienta POST z Jersey? Metoda

curl -d '{"switch": "00:00:00:00:00:00:00:01", "name":"flow-mod-1", "priority":"32768", "ingress-port":"1","active":"true", "actions":"output=2"}' http://localhost:8080/wm/staticflowentrypusher/json 

Więc próbuję dowiedzieć się, jak korzystać z klienta Jersey do wdrożenia powyższego polecenia curl.

tej pory zrobiłem:

public class FLClient { 

private static Client client; 
private static WebResource webResource; 
private static String baseuri = "http://localhost:8080/wm/staticflowentrypusher/json"; 
private static ClientResponse response; 
private static String output = null; 

public static void main(String[] args) { 
    try { 

     client = Client.create(); 

     webResource = client.resource(baseuri); 

        // implement POST data 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

} 

Czy ktoś może mi pomóc z tym?

Odpowiedz

27

Teraz to rozgryzłem. Oto moje rozwiązanie:

public static void main(String[] args) { 

    try { 
     Client client = Client.create(); 

     WebResource webResource = client.resource(baseuri); 

     String input = "{\"switch\": \"00:00:00:00:00:00:00:01\", " 
       + "\"name\":\"flow-mod-1\", \"priority\":\"32768\", " 
       + "\"ingress-port\":\"1\",\"active\":\"true\", " 
       + "\"actions\":\"output=2\"}"; 

     // POST method 
     ClientResponse response = webResource.accept("application/json") 
       .type("application/json").post(ClientResponse.class, input); 

     // check response status code 
     if (response.getStatus() != 200) { 
      throw new RuntimeException("Failed : HTTP error code : " 
        + response.getStatus()); 
     } 

     // display response 
     String output = response.getEntity(String.class); 
     System.out.println("Output from Server .... "); 
     System.out.println(output + "\n"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
18

Jeśli chcesz publikować w treści JSON, tutaj jest lepsze podejście.

ClientConfig clientConfig = new DefaultClientConfig();    
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);  
client = Client.create(clientConfig); 

WebResource webResource = client.resource(baseuri); 

Map<String,Object> postBody = new HashMap<String,Object>(); 
//put switch, name,priority.... 
ClientResponse response = webResource.accept("application/json") 
       .type("application/json").post(ClientResponse.class, postBody); 

Pamiętaj, że musisz to jersey-json

+1

Kocham ten JSON mniej metody json post. HashMap. Schludny. – jettero

+0

to brzmi fajnie, ale nie mogę go uruchomić z FEATURE_POJO_MAPPING i jersey-json.jar: ClientHandlerException: program do zapisu treści wiadomości typu Java, klasa java.util.HashMap i typ nośnika MIME, application/json, nie znaleziono - czego mi brakuje? – TheArchitect

6

dla przyszłych użytkowników, a nowa wersja jersey rzeczy zmieniły, więc sposób prowadzenia takiej metody POST jest:

  • Dla wersji 1.x (@Li'answer):

    WebResource webResource = client.resource(baseuri); 
    
    String input = "..."; 
    
    ClientResponse response = webResource.accept("application/json") 
         .type("application/json").post(ClientResponse.class, input); 
    
  • Dla wersji 2.x:

    WebTarget webTarget = client.target(baseuri); 
    
    String input = "..."; 
    
    Response response = webTarget.request("application/json").post(Entity.json(input)); 
    

podstawie Migration Guide

+0

Nie sądzę (WebTarget) .accept() jest częścią 2.x, przynajmniej już nie. – Erhannis

+0

Ponadto, myślę, że dla 2.x powinien to być Response, a nie ClientResponse. – Erhannis

+0

@ Orhannis masz rację, poprawiłem odpowiedź. Dzięki –

Powiązane problemy