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
Como nadie lo mencionó, aquí hay otro: Feign , que es usado por Spring Cloud .
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:
- Apache CXF tiene tres opciones diferentes de Cliente REST
- Jersey (mencionado anteriormente).
- La primavera también tiene su propio llamado RestTemplate
- Commons HTTP Client construye el tuyo para proyectos Java más antiguos.
ACTUALIZACIÓN circa 2014:
-
Async-http-client por Sonatype. Ning Async-http-client .
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).
- Apache HTTP Components (4.2) Adaptador fluido : mejor que el antiguo Commons HTTP Client 3 y más fácil de usar para crear su propio cliente REST. Tendrá que usar algo como Jackson para el soporte de análisis JSON y puede usar los componentes HTTP URIBuilder para construir URI de recursos similares a los clientes de Jersey / JAX-RS Rest. Los componentes HTTP también son compatibles con NIO, pero dudo que obtenga un mejor rendimiento que BIO dada la naturaleza de solicitud corta de REST.
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:
- Restfulie , basado en el marco web de VRaptor, tiene implementaciones del lado del servidor y del cliente con muy buen soporte de Hypermedia.
- RESTEasy tiene una implementación de cliente basada en proxy JAX-RS .
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.
Prueba JdkRequest
desde jcabi-http (soy un 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 del blog para obtener más detalles: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html
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.