Cliente Java REST sin esquema


Answers

Sugiero escribir frijoles a mano, y solo anotar con anotaciones JAXB si es necesario. Para la mayoría de los accessors / mutators (getters / setters) no es necesario; de forma predeterminada, se consideran todos los accesores y campos de frijol público, el nombre se deriva usando la convención de frijol, y por defecto es usar elementos en lugar de atributos (por lo que los atributos deben ser anotados).

Alternativamente, por supuesto, puede escribir el esquema a mano, generar frijoles usando JAXB, si le gusta mucho el esquema W3C. Y solo use el código resultante, no el esquema, para el enlace de datos.

En cuanto a POJO: eso puede ser muy simple. Algo como:

@XmlRootElement("Response")
class Response {
  public int responseCode;
  public String responseMessage;
  public String token; // or perhaps byte[] works for automated base64?
}

y de manera similar para otros. O bien, usa getters / setters si te gustan y no te importa un poco más de detalle. Estos son solo contenedores de datos, no es necesario ser demasiado elegante.

Y si debe detectar automáticamente el tipo de contenido, considere usar el analizador de Stax para ver cuál es el elemento raíz, y luego agréguelo utilizando JAXB Unmarshaller, y entregue XMLStreamReader que apunta a ese elemento raíz. De esa forma puedes pasar diferentes tipos de objetos para enlazar.

Y finalmente: enviar / recibir solicitudes: simple viejo HttpURLConnection funciona bien para solicitudes GET y POST (construye usando, digamos, URL.openConnection ()). Jakarta HttpClient tiene más funciones si es necesario. Por lo tanto, muchas veces no se necesita un cliente REST por separado; pueden ser útiles, pero generalmente se basan en simples piezas de cliente HTTP.

Question

Gol

Cliente Java para HotJobs Resumé Search REST API de Yahoo.

Fondo

Estoy acostumbrado a escribir clientes de servicios web para las API de SOAP, donde wsimport genera stubs de proxy y está apagado y en funcionamiento. Pero esta es una API REST, que es nueva para mí.

Detalles

Progreso

Miré a la pregunta Rest Customers para Java? , pero las soluciones automatizadas allí suponen que está proporcionando el servidor y el cliente, con JAXB invocado en POJO para generar un esquema y una API REST.

Utilizando Jersey (una implementación JAX-RS ), he podido hacer una solicitud HTTP manual:

import com.sun.jersey.api.client.*;

...

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

WebResource webResource = client.resource("https://hj.yahooapis.com/v1/HJAuthTokens");
webResource.accept("application/xml");

// body is a hard-coded string, with replacements for the variable bits
String response = webResource.post(String.class, body);

// parse response into a org.w3c.dom.Document
// interface with Document via XPATH, or write my own POJO mappings

La respuesta puede verse así:

<?xml version="1.0" encoding="utf-8"?>   
<Response>   
    <ResponseCode>0</ResponseCode>   
    <ResponseMessage>Login successful</ResponseMessage>
    <Token>NTlEMTdFNjk3Qjg4NUJBNDA3MkJFOTI3NzJEMTdDNDU7bG9jYWxob3N0LmVnbGJwLmNvcnAueWFob28uY29tO0pVNWpzRGRhN3VhSS4yQVRqRi4wWE5jTWl0RHVVYzQyX3luYWd1TjIxaGx6U0lhTXN3LS07NjY2MzM1OzIzNDY3NTsxMjA5MDE2OTE5OzZCM1RBMVNudHdLbl9VdFFKMFEydWctLQ==</Token>   
</Response>  

O bien, puede verse así:

<?xml version="1.0" encoding="utf-8"?>   
<yahoo:error xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" xml:lang="en-US">   
    <yahoo:description>description</yahoo:description>   
    <yahoo:detail>   
        <ErrorCode>errorCode</ErrorCode>   
    </yahoo:detail>   
</yahoo:error>  

Preguntas

  • ¿Hay alguna manera de autogenerar POJOs que pueden ser agrupados / no mapeados sin un esquema formal?
  • ¿Debería intentar generar esos POJO a mano, con anotaciones JAXB ?
  • ¿Hay alguna herramienta que debería aprovechar, así que no tengo que hacer todo esto manualmente?