Pregunta

Goal

cliente Java para los de Yahoo HotJobs curriculum Buscar REST API .

Fondo

Estoy acostumbrado a escribir clientes de servicios web para las API de SOAP, donde wsimport genera talones de proxy y ya está fuera de funcionamiento. Pero esto es una API REST, que es nuevo para mí.

Detalles

Progreso

Miré pregunta clientes de descanso para Java? , pero las soluciones automatizadas hay que asumir están proporcionando el servidor y el cliente, con JAXB invocado en POJOs para generar un esquema y una API REST.

Uso Jersey (a JAX-RS aplicación), he sido capaz de hacer una petición 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 ser:

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

O, que puede ser:

<?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 una manera de auto-generar POJOs que puede ser marshalled / unmarshalled sin esquema formal?
  • ¿Debo tratar de generar esas POJOs a mano, con JAXB anotaciones?
  • ¿Hay alguna herramienta que debería estar Aprovechando así que no tengo que hacer todo esto de forma manual?
¿Fue útil?

Solución

Es interesante que proporcionan una dirección URL HTTP como el URI de espacio para el esquema, pero en realidad no guardan su esquema de allí. Eso podría ser un descuido por su parte, que un correo electrónico o lista de discusión publicación podría corregir.

Un enfoque consiste en crear su propio esquema, pero esto parece mucho trabajo para poco rendimiento. Dada la forma sencilla los mensajes son, me pregunto si es que se necesita un POJO para envolverlos? ¿Por qué no acaba de tener un manejador que extrae los datos que necesita el uso de XPath?


Editar: explosión del pasado, pero vi el comentario, vuelvan a leer la pregunta, y se dieron cuenta de que la primera frase era difícil de entender. Por lo tanto, una aclaración:

Un hábito muy bueno, si vas a escribir un servicio web de acceso público, es hacer que su documento de esquema disponible en la misma dirección URL que se utiliza para el esquema de la URI de espacio - o mejor, habría que ser un URL enlace para completar la documentación (el espacio de nombres W3C XSD es en sí mismo un buen ejemplo: http://www.w3.org / 2001 / XMLSchema ).

Otros consejos

Yo sugeriría escribir granos a mano, y sólo anotar con anotaciones JAXB si es necesario. Para la mayoría de los descriptores de acceso / mutators (getters / setters) que no tiene que; por defecto se consideran todos los descriptores de acceso y campos de frijol públicas, nombre se deriva utilizando la convención de frijol, y por defecto es usar elementos en vez de atributos (atributos de modo necesitan ser anotada).

Como alternativa, puede por supuesto esquema de escritura a mano, generar granos utilizando JAXB, si te gusta el esquema del W3C mucho. Y sólo tiene que utilizar el código resultante, no de esquema, para el enlace de datos.

En cuanto a POJO: que puede ser muy simple. Algo así como:

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

y lo mismo para los otros. O bien, utilizar métodos get / set si les gusta y no les importa poco más verbosidad. Estos son sólo contenedores de datos, no hay necesidad de llegar demasiado elegante.

Y si debe detectar automáticamente el tipo de contenido, considere el uso de Stax analizador para ver lo que el elemento raíz, y luego enlazar utilizando JAXB Unmarshaller, entregando XMLStreamReader que apunta a que el elemento raíz. De esa manera se puede pasar diferente tipo de objeto de obligar a.

Y por último: envío / recepción de solicitudes: el viejo y simple HttpURLConnection funciona bien para GET y POST peticiones (constructo utilizando, por ejemplo, URL.openConnection ()). Yakarta HttpClient tiene más funciones si es necesario. Así que muchas veces no se necesita realmente un cliente REST separada - que puede ser útil, pero en general la construcción de piezas cliente HTTP simples

.

Me parece HTTP4E muy útil para realizar llamadas REST. Es un plugin de Eclipse impresionante, tiene pestañas, coloreado de sintaxis, auto sugieren, generación de código, llamado REST HTTP reproducción, etc .. Se hace un gran trabajo de depuración de HTTP, HTTP manipulación, piratería. Estoy divirtiendo mucho con él.

http://www.ywebb.com/

Trate de JdkRequest 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()

Comprobar esta entrada del blog para más detalles: http: // www.yegor256.com/2014/04/11/jcabi-http-intro.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top