2013-04-29 5 views
21

Sono nuovo di Jersey. Devo implementare un client Jersey per inviare i dati con il metodo POST. Il comando ricciolo è:Come inviare i dati con il metodo POST del client Jersey

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 

Così sto cercando di capire come utilizzare client Jersey per implementare il comando ricciolo sopra.

Finora ho fatto:

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

} 

qualcuno può aiutarmi con esso?

risposta

27

Ora lo capisco. Ecco la mia soluzione:

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

Se si desidera pubblicare all'interno di un corpo JSON, ecco un approccio migliore.

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

Ricordati di includere jersey-json

+1

amo questo metodo JSON dopo JSON-less. HashMap. Neat. – jettero

+0

sembra interessante, ma non riesco a farlo funzionare con FEATURE_POJO_MAPPING e jersey-json.jar: ClientHandlerException: un writer del corpo del messaggio per tipo Java, classe java.util.HashMap e tipo di supporto MIME, application/json, non è stato trovato - cosa mi manca? – TheArchitect

6

Per gli utenti in futuro, con la nuova versione di jersey cose è cambiato, quindi il modo di fare tale metodo POST è:

  • Per le versioni 1.x (@Li'answer):

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

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

Sulla base del Migration Guide

+0

Non penso (WebTarget). Accept() è una parte di 2.x, almeno non più. – Erhannis

+0

Inoltre, penso che per 2.x dovrebbe essere Response, non ClientResponse. – Erhannis

+0

@Erhannis hai ragione su entrambi, ho risolto la risposta. Grazie –