closeablehttpclient java rest

java - closeablehttpclient - httpclient set timeout c#



Llamada REST en Java (10)

Voy a hacer una llamada RESTful en Java. Sin embargo, no sé cómo hacer la llamada. ¿Necesito usar URLConnection u otros? Alguien puede ayudarme. gracias.


De hecho, esto es "muy complicado en Java":

De: jersey.java.net/documentation/latest/client.html

Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://foo").path("bar"); Invocation.Builder invocationBuilder = target.request(MediaType.TEXT_PLAIN_TYPE); Response response = invocationBuilder.get();




La mayoría de Easy Solution utilizará la biblioteca cliente http de Apache. consulte el siguiente código de muestra ... este código usa seguridad básica para la autenticación.

Agregue la siguiente dependencia.

<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency>

CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); Credentials credentials = new UsernamePasswordCredentials("username", "password"); credentialsProvider.setCredentials(AuthScope.ANY, credentials); HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build(); HttpPost request = new HttpPost("https://api.plivo.com/v1/Account/MAYNJ3OT/Message/");HttpResponse response = client.execute(request); // Get the response BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = ""; while ((line = rd.readLine()) != null) { textView = textView + line; } System.out.println(textView);


Puede utilizar Async Http Client (la biblioteca también es compatible con el protocolo WebSocket ) así:

String clientChannel = UriBuilder.fromPath("http://localhost:8080/api/{id}").build(id).toString(); try (AsyncHttpClient asyncHttpClient = new AsyncHttpClient()) { BoundRequestBuilder postRequest = asyncHttpClient.preparePost(clientChannel); postRequest.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); postRequest.setBody(message.toString()); // returns JSON postRequest.execute().get(); }


Puedes ver el CXF . Puede visitar el artículo JAX-RS CXF

Llamar es tan simple como esto (cita):

BookStore store = JAXRSClientFactory.create("http://bookstore.com", BookStore.class); // (1) remote GET call to http://bookstore.com/bookstore Books books = store.getAllBooks(); // (2) no remote call BookResource subresource = store.getBookSubresource(1); // {3} remote GET call to http://bookstore.com/bookstore/1 Book b = subresource.getDescription();


Quiero compartir mi experiencia personal, llamando a un REST WS con una llamada Post JSON:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.URL; import java.net.URLConnection; public class HWS { public static void main(String[] args) throws IOException { URL url = new URL("INSERT YOUR SERVER REQUEST"); //Insert your JSON query request String query = "{''PARAM1'': ''VALUE'',''PARAM2'': ''VALUE'',''PARAM3'': ''VALUE'',''PARAM4'': ''VALUE''}"; //It change the apostrophe char to double colon char, to form a correct JSON string query=query.replace("''", "/""); try{ //make connection URLConnection urlc = url.openConnection(); //It Content Type is so importan to support JSON call urlc.setRequestProperty("Content-Type", "application/xml"); Msj("Conectando: " + url.toString()); //use post mode urlc.setDoOutput(true); urlc.setAllowUserInteraction(false); //send query PrintStream ps = new PrintStream(urlc.getOutputStream()); ps.print(query); Msj("Consulta: " + query); ps.close(); //get result BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream())); String l = null; while ((l=br.readLine())!=null) { Msj(l); } br.close(); } catch (Exception e){ Msj("Error ocurrido"); Msj(e.toString()); } } private static void Msj(String texto){ System.out.println(texto); } }


Si está llamando a un servicio RESTful de un proveedor de servicios (por ejemplo, Facebook, Twitter), puede hacerlo con el sabor que desee:

Si no desea utilizar bibliotecas externas, puede usar java.net.HttpURLConnection o javax.net.ssl.HttpsURLConnection (para SSL), pero eso se llama encapsulado en un patrón de tipo Factory en java.net.URLConnection . Para recibir el resultado, tendrá que connection.getInputStream() que le devuelve un InputStream . Luego tendrá que convertir su secuencia de entrada en cadena y analizar la cadena en su objeto representativo (por ejemplo, XML, JSON, etc.).

Alternativamente, Apache HttpClient (la versión 4 es la última). Es más estable y robusto que el URLConnection predeterminado de URLConnection y es compatible con la mayoría (si no con todos) del protocolo HTTP (así como con el modo estricto). Su respuesta seguirá estando en InputStream y puede usarla como se mencionó anteriormente.

Documentación en HttpClient: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html


Si solo necesita hacer una simple llamada a un servicio REST desde Java, use algo a lo largo de esta línea

/* * Stolen from http://xml.nig.ac.jp/tutorial/rest/index.html * and http://www.dr-chuck.com/csev-blog/2007/09/calling-rest-web-services-from-java/ */ import java.io.*; import java.net.*; public class Rest { public static void main(String[] args) throws IOException { URL url = new URL(INSERT_HERE_YOUR_URL); String query = INSERT_HERE_YOUR_URL_PARAMETERS; //make connection URLConnection urlc = url.openConnection(); //use post mode urlc.setDoOutput(true); urlc.setAllowUserInteraction(false); //send query PrintStream ps = new PrintStream(urlc.getOutputStream()); ps.print(query); ps.close(); //get result BufferedReader br = new BufferedReader(new InputStreamReader(urlc .getInputStream())); String l = null; while ((l=br.readLine())!=null) { System.out.println(l); } br.close(); } }


Actualización: Han pasado casi 5 años desde que escribí la respuesta a continuación; hoy tengo una perspectiva diferente.

El 99% del tiempo cuando las personas usan el término REST, realmente quieren decir HTTP; les pueden importar menos los "recursos", las "representaciones", las "transferencias de estado", las "interfaces uniformes", los "hipermedia", o cualquier otra restricción o aspecto del estilo de arquitectura REST identificado por Fielding . Las abstracciones proporcionadas por varios marcos REST son, por lo tanto, confusas e inútiles.

Entonces: desea enviar solicitudes HTTP utilizando Java en 2015. Desea una API que sea clara, expresiva, intuitiva, idiomática, simple. Qué usar? Ya no uso Java, pero en los últimos años la biblioteca de cliente HTTP de Java que me ha parecido más prometedora e interesante es OkHttp . Echale un vistazo.

Definitivamente puede interactuar con servicios web RESTful mediante el uso de URLConnection o HTTPClient para codificar las solicitudes HTTP.

Sin embargo, generalmente es más conveniente usar una biblioteca o marco que proporcione una API más simple y semántica específicamente diseñada para este propósito. Esto hace que el código sea más fácil de escribir, leer y depurar, y reduce la duplicación de esfuerzos. Estos marcos generalmente implementan algunas funciones geniales que no están necesariamente presentes o son fáciles de usar en las bibliotecas de nivel inferior, como la negociación de contenido, el almacenamiento en caché y la autenticación.

Algunas de las opciones más maduras son Jersey , RESTEasy y Restlet .

Estoy familiarizado con Restlet y Jersey, veamos cómo haríamos una solicitud POST con ambas API.

Jersey Ejemplo

Form form = new Form(); form.add("x", "foo"); form.add("y", "bar"); Client client = ClientBuilder.newClient(); WebTarget resource = client.target("http://localhost:8080/someresource"); Builder request = resource.request(); request.accept(MediaType.APPLICATION_JSON); Response response = request.get(); if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) { System.out.println("Success! " + response.getStatus()); System.out.println(response.getEntity()); } else { System.out.println("ERROR! " + response.getStatus()); System.out.println(response.getEntity()); }

Ejemplo de Restlet

Form form = new Form(); form.add("x", "foo"); form.add("y", "bar"); ClientResource resource = new ClientResource("http://localhost:8080/someresource"); Response response = resource.post(form.getWebRepresentation()); if (response.getStatus().isSuccess()) { System.out.println("Success! " + response.getStatus()); System.out.println(response.getEntity().getText()); } else { System.out.println("ERROR! " + response.getStatus()); System.out.println(response.getEntity().getText()); }

Por supuesto, las solicitudes GET son incluso más simples, y también puede especificar elementos como etiquetas de entidad y encabezados Accept , pero esperamos que estos ejemplos sean útilmente no triviales pero no demasiado complejos.

Como puede ver, Restlet y Jersey tienen API de cliente similares. Creo que se desarrollaron al mismo tiempo y, por lo tanto, se influyeron mutuamente.

Encuentro que la API de Restlet es un poco más semántica, y por lo tanto un poco más clara, pero YMMV.

Como dije, estoy muy familiarizado con Restlet, lo he usado en muchas aplicaciones durante años y estoy muy contento con él. Es un marco muy maduro, robusto, simple, efectivo, activo y bien respaldado. No puedo hablar con Jersey ni con RESTE fácil, pero mi impresión es que también son opciones sólidas.