Pregunta

Con JSR 311 y sus implementaciones tenemos un poderoso estándar para exponer objetos Java a través de REST. Sin embargo, en el lado del cliente parece faltar algo que es comparable a Apache Axis para SOAP, algo que oculta el servicio web y hace que los datos vuelvan a los objetos Java de forma transparente.

¿Cómo se crean clientes RESTful de Java? ¿Usando HTTPConnection y análisis manual del resultado? O clientes especializados para, p. Jersey o Apache CXR?

¿Fue útil?

Solución

Esta es una vieja pregunta (2008), por lo que ahora hay muchas más opciones de las que tenía entonces:

ACTUALIZACIÓN alrededor de 2014:

El nuevo chico en el bloque que proporciona soporte NIO (aunque en verdad no creo que esto realmente mejore el rendimiento para los clientes como lo hace con los servidores).

ACTUALIZACIÓN 2016 :

  • OkHttp : admite protocolos HTTP más nuevos (SPDY y HTTP2). Funciona en Android. Desafortunadamente, no ofrece una verdadera opción asincrónica basada en bucle de reactor (ver componentes Ning y HTTP más arriba) Sin embargo, si usa el protocolo HTTP2 más nuevo, esto no es un problema (suponiendo que el recuento de conexiones sea un problema).
  • Retrofit : creará automáticamente clientes basados ??en stubs de interfaz similares a algunas extensiones de Jersey y CXF. Utiliza OkHttp.
  • Apache HttpComponents 5 supuestamente tendrá soporte HTTP2

Una advertencia sobre la selección de clientes HTTP / REST. Asegúrese de verificar qué está usando su stack de framework para un cliente HTTP, cómo se enhebra, e idealmente use el mismo cliente si ofrece uno. Es decir, si usa algo como Vert.x o Play, puede intentar usar su cliente de respaldo para participar en cualquier bus o bucle de reactor que el marco proporcione ... de lo contrario, esté preparado para posibles problemas de subprocesos.

Otros consejos

Como mencioné en este hilo tiendo a usar Jersey que implementa JAX-RS y viene con un buen cliente REST. Lo bueno es que si implementa sus recursos RESTful utilizando JAX-RS, el cliente de Jersey puede reutilizar los proveedores de entidades como JAXB / XML / JSON / Atom, etc., para que pueda reutilizar los mismos objetos en el lado del servidor que usted utilizar en la prueba de la unidad del lado del cliente.

Por ejemplo aquí hay un caso de prueba de unidad del Proyecto Apache Camel que busca cargas XML desde un recurso RESTful (utilizando los puntos finales del objeto JAXB). El método de recursos (uri) se define en esta clase base que solo usa la API del cliente de Jersey.

por ejemplo

    clientConfig = new DefaultClientConfig();
    client = Client.create(clientConfig);

    resource = client.resource("http://localhost:8080");
    // lets get the XML as a String
    String text = resource("foo").accept("application/xml").get(String.class);        

Por cierto, espero que la versión futura de JAX-RS agregue una buena API del lado del cliente en línea con la de Jersey

Puede usar las API estándar de Java SE:

private void updateCustomer(Customer customer) { 
    try { 
        URL url = new URL("http://www.example.com/customers"); 
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        connection.setDoOutput(true); 
        connection.setInstanceFollowRedirects(false); 
        connection.setRequestMethod("PUT"); 
        connection.setRequestProperty("Content-Type", "application/xml"); 

        OutputStream os = connection.getOutputStream(); 
        jaxbContext.createMarshaller().marshal(customer, os); 
        os.flush(); 

        connection.getResponseCode(); 
        connection.disconnect(); 
    } catch(Exception e) { 
        throw new RuntimeException(e); 
    } 
} 

O puede usar las API de cliente REST proporcionadas por implementaciones de JAX-RS como Jersey. Estas API son más fáciles de usar, pero requieren archivos jar adicionales en su ruta de clase.

WebResource resource = client.resource("http://www.example.com/customers"); 
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer."); 
System.out.println(response); 

Para más información ver:

Si solo desea invocar un servicio REST y analizar la respuesta, puede probar Descanse asegurado

// Make a GET request to "/lotto"
String json = get("/lotto").asString()
// Parse the JSON response
List<String> winnderIds = with(json).get("lotto.winners.winnerId");

// Make a POST request to "/shopping"
String xml = post("/shopping").andReturn().body().asString()
// Parse the XML
Node category = with(xml).get("shopping.category[0]");

También puede consultar Restlet que tiene todas las capacidades del lado del cliente, más orientado a REST que las bibliotecas de nivel inferior, como como HttpURLConnection o Apache HTTP Client (que podemos aprovechar como conectores).

Saludos cordiales, Jerome Louvel

Puedes probar Rapa . Háganos saber sus comentarios sobre el mismo. Y no dude en registrar problemas o características esperadas.

Recientemente he intentado Retrofit Biblioteca desde el cuadrado, es genial y puedes llamar a tu API de descanso muy facilmente. La configuración basada en anotaciones nos permite eliminar gran parte de la codificación de la placa de la caldera.

Me gustaría señalar 2 opciones más:

Utilizo Apache HTTPClient para manejar todo el lado HTTP de las cosas.

Escribo analizadores XML SAX para el contenido XML que analiza el XML en su modelo de objetos. Creo que Axis2 también expone XML - > Métodos de modelo (el eje 1 ocultó esta parte, molestamente). Los generadores XML son trivialmente simples.

No lleva mucho tiempo codificar, y es bastante eficiente, en mi opinión.

OkHttp es ligero y potente cuando se combina con Retrofit también. Esto funciona bien para el uso general de Java, así como en Android.

OkHttp : http://square.github.io/okhttp/

public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

Retrofit : http://square.github.io/retrofit/

public interface GitHubService {
  @GET("/users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

Pruebe JdkRequest en jcabi-http (soy desarrollador). Así es como funciona:

String body = new JdkRequest("http://www.google.com")
  .header("User-Agent", "it's me")
  .fetch()
  .body()

Consulte esta publicación de blog para obtener más detalles: http: // www.yegor256.com/2014/04/11/jcabi-http-intro.html

Como nadie lo mencionó, aquí hay otro: Feign , que es utilizado por Spring Cloud .

Por un tiempo, he estado usando Resty :

JSONResource jsonResource = new Resty (). json (uri);

Uno puede encontrar algunos ejemplos aquí .

Aunque es simple crear un cliente HTTP y realizar una solicitud. Pero si desea utilizar algunos clientes generados automáticamente, puede utilizar WADL para describir y generar código.

Puede usar RestDescribe para generar y compilar WSDL, puede generar clientes en php, ruby, python, java y C # usando esto. Genera código limpio y hay un buen cambio que debe modificar un poco después de la generación del código, puede encontrar buena documentación y pensamientos subyacentes detrás de la herramienta aquí .

Hay pocas herramientas WADL mencionadas y útiles en Wintermute.

Escribí una biblioteca que asigna una interfaz Java a un servicio REST JSON remoto:

https://github.com/ggeorgovassilis/spring-rest-invoker

public interface BookService {
   @RequestMapping("/volumes")
   QueryResult findBooksByTitle(@RequestParam("q") String q);

   @RequestMapping("/volumes/{id}")
   Item findBookById(@PathVariable("id") String id);
}

Intente buscar en http-rest-client

https://github.com/g00dnatur3/http-rest-client

Aquí hay un ejemplo simple:

RestClient client = RestClient.builder().build();
String geocoderUrl = "http://maps.googleapis.com/maps/api/geocode/json"
Map<String, String> params = Maps.newHashMap();
params.put("address", "beverly hills 90210");
params.put("sensor", "false");
JsonNode node = client.get(geocoderUrl, params, JsonNode.class);

La biblioteca se encarga de la serialización y el enlace de json por usted.

Aquí hay otro ejemplo,

RestClient client = RestClient.builder().build();
String url = ...
Person person = ...
Header header = client.create(url, person);
if (header != null) System.out.println("Location header is:" + header.value());

Y un último ejemplo,

RestClient client = RestClient.builder().build();
String url = ...
Person person = client.get(url, null, Person.class); //no queryParams

¡Salud!

Ejemplos de cliente de Jersey Rest:
Añadiendo dependencia:

         <!-- jersey -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>
   <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
    </dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.8</version>
</dependency>

    <dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

ForGetMethod y pasando dos parámetros:

          Client client = Client.create();
           WebResource webResource1 = client
                        .resource("http://localhost:10102/NewsTickerServices/AddGroup/"
                                + userN + "/" + groupName);

                ClientResponse response1 = webResource1.get(ClientResponse.class);
                System.out.println("responser is" + response1);

GetMethod pasando un parámetro y obteniendo una respuesta de la lista:

       Client client = Client.create();

        WebResource webResource1 = client
                    .resource("http://localhost:10102/NewsTickerServices/GetAssignedUser/"+grpName);    
    //value changed
    String response1 = webResource1.type(MediaType.APPLICATION_JSON).get(String.class);

    List <String > Assignedlist =new ArrayList<String>();
     JSONArray jsonArr2 =new JSONArray(response1);
    for (int i =0;i<jsonArr2.length();i++){

        Assignedlist.add(jsonArr2.getString(i));    
    }

In Above It devuelve una lista que estamos aceptando como lista y luego la convertimos a Json Array y luego a Json Array en lista.

Si la solicitud de envío pasa el objeto Json como parámetro:

   Client client = Client.create();
    WebResource webResource = client
            .resource("http://localhost:10102/NewsTickerServices/CreateJUser");
    // value added

    ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class,mapper.writeValueAsString(user));

    if (response.getStatus() == 500) {

        context.addMessage(null, new FacesMessage("User already exist "));
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top