2008-10-21 26 views
189

Con JSR 311 y sus implementaciones, tenemos un estándar potente para exponer objetos Java a través de Rest. Sin embargo, en el lado del cliente parece que falta algo que es comparable a Apache Axis for SOAP, algo que oculta el servicio web y ordena los datos de forma transparente a los objetos de Java.¿Cliente de reposo para Java?

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

+2

mira esto: http://igorpolevoy.blogspot.com/2011/01/java-rest-with-ease.html gracias igor – ipolevoy

+0

Si eres interesante en el plugin de Eclipse para generar una clase de cliente java de WADL, se puede ver en el enlace http://stackoverflow.com/questions/9159881/restful-client-from-wadl/16709008#16709008 – pasquy73

+0

Acabo de encontrar [Apache Wink] (http://wiki.apache.org/incubator/WinkProposal) en la Incubadora Apache. Podría ser un proyecto interesante para crear servidores y clientes REST. – Yaba

Respuesta

149

Ésta es una cuestión de edad (2008) por lo que hay muchas más opciones ahora que había entonces:

ACTUALIZACIÓN circa 2014:

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

ACTUALIZACIÓN 2016:

  • OkHttp - Soporta nuevos protocolos HTTP (SPDY y HTTP2). Funciona en Android. Desafortunadamente, no ofrece una verdadera opción asíncrona basada en bucle de reactor (consulte los componentes Ning y HTTP más arriba). Sin embargo, si utiliza el protocolo HTTP2 más nuevo, este no es un problema (suponiendo que el conteo de la conexión 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 se supone que tienen el apoyo HTTP2

Una advertencia en recoger clientes HTTP/REST. Asegúrese de verificar qué es lo que está usando la pila de su infraestructura para un cliente HTTP, cómo se enhebra e, idealmente, use el mismo cliente si ofrece uno. Eso es si estás usando algo como Vert.x o Play, es posible que desee intentar usar su cliente de respaldo para participar en cualquier bucle de bus o reactor que proporcione el marco ... de lo contrario, prepárese para problemas de enhebrado posiblemente interesantes.

+16

[UniREST] (http://unirest.io/#java) también es bastante bueno hoy en día. – Subhas

+0

Lamentablemente, el cliente de Jersey no admite el método PATCH si se usa con JDK <8 – botchniaque

+1

, así como el cliente de Jersey tiene algunas fugas de memoria graves https://java.net/jira/browse/JERSEY-2830 – Dejell

4

Uso 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 hace falta codificar, y es bastante eficiente, en mi opinión.

+4

En mi opinión, esta es la peor forma de hacer REST. Manualmente manejar la serialización en Java es una pérdida de tiempo cuando tienes tantas opciones como JAXB y Jackson.Incluso cargar todo el documento y usar XPath es marginalmente más lento que SAX y nada comparado con obtener el XML (velocidad de la red). –

+0

podría decir, "estoy de acuerdo". – gumuruh

+1

Estoy de acuerdo, y escribí el comentario original. En aquel entonces tenía el deseo de controlar la deserialización, pero hoy en día usaría Jackson y las clases modelo decentemente anotadas. – JeeBee

69

Como mencioné en this thread 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 usar en la prueba de la unidad del lado del cliente.

Por ejemplo, here is a unit test case del Apache Camel project que busca las cargas XML de un recurso REST (utilizando los puntos finales del objeto JAXB). El método de recursos (uri) se define en this base class que solo usa la API de cliente de Jersey.

p. Ej.

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 las futuras versiones de JAX-RS añadir un buen API del lado del cliente en la línea de la que en Jersey

+0

¿Hay algún método donde podamos mencionar la lista de servidores de servicios REST en ClientResource, en caso de que el servidor no funcione, intente con el siguiente servidor? – Njax3SmmM2x2a0Zf7Hpd

+1

Solo una actualización, pero para abordar el comentario de James '' BTW '', la nueva versión de JAX-RS 2.0 tendrá una API del lado del cliente: http://www.infoq.com/presentations/Java-REST –

+4

El enlace con el texto "aquí está un caso de prueba de unidad" está roto. – dmiller309

10

También puede comprobar Restlet que tiene capacidades de cliente completo, más descanso orientado a bibliotecas de nivel inferior como HttpURLConnection o Apache HTTP Client (que podemos aprovechar como conectores).

Saludos, Jerome Louvel

7

usted podría intentar Rapa. Háganos saber sus comentarios sobre el mismo. Y siéntase libre de registrar problemas o características esperadas.

+1

Rapa tiene una interfaz realmente agradable y pocas dependencias. Una buena alternativa a RestSharp en el mundo .NET. – afternoon

57

Puede utilizar 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 utilizar las API de cliente de descanso previstos por JAX-RS implementaciones como Jersey. Estas API son más fáciles de usar, pero requieren tarros 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:

+1

13 líneas para una llamada de descanso simple, ** en 2018 **, suena demasiado ... –

9

Si sólo desea invocar un servicio REST y analizar la respuesta puede probar Rest Assured

// 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]"); 
5

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

  • Restfulie, sobre la base de el framework web VRaptor, tiene implementaciones de servidor y de lado del cliente con muy buena compatibilidad con Hypermedia.
  • RESTEasy tiene una implementación de JAX-RS proxy based client.
0

A pesar de su sencilla para crear un cliente HTTP y crea un reuest. 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 tienes que modificar un poco después de la generación del código, puedes encontrar buena documentación y pensamientos subyacentes detrás de la herramienta here.

Hay pocos interesantes y útiles WADL tools mencionados en wintermute.

1

escribí una biblioteca que se asigna una interfaz Java para 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); 
} 
5

recientemente he intentado Retrofit Biblioteca de la plaza, su gran y se puede llamar a su descanso API muy fácilmente. La configuración basada en anotaciones nos permite deshacernos del lote de codificación de la placa de la caldera.

-1

Puede utilizar java.net.URL

public class URL { 
public URL(java.lang.String s) 
throws java.net.MalformedURLException {} 
public java.net.URLConnection 
openConnection() throws java.io.IOException {} 
... 
} 

desde una dirección URL, puede crear un HttpURLConnection que le permite invocar específica

requests. Here’s an example of doing a simple GET request: 
URL url = new URL("http://example.com/customers/1"); 
connection = (HttpURLConnection) getUrl.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setRequestProperty("Accept", "application/xml"); 
if (connection.getResponseCode() != 200) { 
throw new RuntimeExceptioin("Operation failed: " 
+ connection.getResponseCode()); 
} 
System.out.println("Content-Type: 

" + connection.getContentType()); 
BufferedReader reader = new BufferedReader(new 
InputStreamReader(connection.getInputStream())); 
String line = reader.readLine(); 
while (line != null) { 
System.out.println(line); 
line = reader.readLine(); 
} 
connection.disconnect(); 
1

Trate de buscar en http-resto-cliente

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

Aquí está un ejemplo sencillo:

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 json y el enlace para 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!

0

Ejemplos de cliente jersey de ocio:
Adición de 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 pasan 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 que pasan un parámetro y conseguir un Respone de 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));  
    } 

En el I de arriba t Devuelve una Lista que aceptamos como una Lista y luego la convierte en Json Array y luego Json Array en List.

Si Publicar demanda que pasa JSON objeto 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 ")); 
    } 
4

OkHttp es ligero y potente cuando se combina con reequipamiento 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(); 
} 

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

public interface GitHubService { 
    @GET("https://stackoverflow.com/users/{user}/repos") 
    Call<List<Repo>> listRepos(@Path("user") String user); 
} 
2

Desde hace un tiempo, he estado usando Resty:

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

Uno puede encontrar algunos ejemplos here.