example ejemplo cliente java rest client

ejemplo - java api rest client



¿REST clientes para Java? (17)

Aunque es simple crear un cliente HTTP y hacer una solicitud. Pero si desea hacer uso de algunos clientes generados automáticamente, puede usar 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 de que hay que modificarlo un poco después de la generación del código; aquí puede encontrar buena documentación y pensamientos subyacentes detrás de la herramienta.

Hay pocas herramientas WADL interesantes y útiles mencionadas en wintermute.

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, por ejemplo, Jersey o Apache CXR?


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 la entidad, 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 unitaria del proyecto Apache Camel que busca las cargas útiles XML de 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.

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 la futura versión de JAX-RS agregue una buena API del lado del cliente en línea con la de Jersey



Desde hace un tiempo, he estado usando Resty :

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

Uno puede encontrar algunos ejemplos here .


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 una lista y luego la convertimos a Json Array y luego a Json Array en List.

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


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


Esta es una pregunta antigua (2008), por lo que ahora hay muchas más opciones de las que había en ese momento:

ACTUALIZACIÓN circa 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 asíncrona basada en el circuito del reactor (consulte los componentes Ning y HTTP más arriba). Sin embargo, si utiliza el protocolo HTTP2 más reciente, esto representa un problema menor (suponiendo que el recuento de conexiones sea un problema).
  • Retrofit : creará automáticamente clientes basados ​​en apéndices de interfaz similares a algunas extensiones de Jersey y CXF. Utiliza OkHttp.
  • Apache HttpComponents 5 supuestamente tendrá soporte HTTP2

Una advertencia en la selección de clientes HTTP / REST. Asegúrese de verificar qué está usando la pila de su marco de trabajo para un cliente HTTP, cómo funciona el subprocesamiento y, de manera ideal, 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 bucle de reactor o reactor que proporcione el marco ... de lo contrario, prepárese para posibles problemas de subprocesos.


Intenta mirar 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 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

¡Aclamaciones!


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


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 : Retrofit

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


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



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 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:


Recientemente he intentado Retrofit Library from square, es genial y puedes llamar a tu API de descanso muy fácilmente. La configuración basada en anotaciones nos permite eliminar gran parte de la codificación de la placa de la caldera.


Si solo 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]");


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 HttpURLConnection o Apache HTTP Client (que podemos aprovechar como conectores).

Saludos cordiales, Jerome Louvel


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 objeto. Creo que Axis2 también expone XML -> Métodos de modelo (Axis 1 escondió esta parte, de manera molesta). Los generadores de XML son trivialmente simples.

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