Domanda

Obiettivo

Client Java per Yahoo HotJobs Curriculum vitae di Ricerca API REST.

Sfondo

Sono abituato a scrivere web-servizio clienti per la SOAP Api, dove wsimport genera proxy stub e sei fuori e in esecuzione.Ma questa è una API REST, che è nuovo per me.

Dettagli

Corso

Ho guardato domanda Resto clienti per Java?, ma le soluzioni automatizzate ci si supponga che si sta fornendo il server e il client, con JAXB richiamato su Pojo per generare uno schema e una API REST.

Utilizzando Jersey (un JAX-RS attuazione), sono stato in grado di rendere un manuale di richiesta HTTP:

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 risposta può apparire come:

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

O, si può guardare come:

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

Domande

  • C'è un modo per auto-generare Pojo quale può essere il marshalling/unmarshalled senza una formale dello schema?
  • Devo cercare di generare tali Pojo a mano, con JAXB le annotazioni?
  • C'è qualche strumento che dovrebbe essere sfruttando così non devo fare tutto questo manualmente?
È stato utile?

Soluzione

La cosa interessante è che essi forniscono un URL HTTP come l'URI dello spazio dei nomi per lo schema, ma in realtà non salvare il loro schema di lì.Che potrebbe essere una svista da parte loro, che un e-mail o discussione-elenco distacco potrebbe correggere.

Un approccio è quello di creare il tuo schema, ma questo sembra un sacco di lavoro per un po ' di ritorno.Dato come semplici messaggi, mi chiedo se anche avete bisogno di un POJO di inserirli?Perché non basta avere un gestore che estrae i dati, è necessario utilizzare XPath?


Edit:tuffo nel passato, ma ho visto il commento, rileggere la domanda, e si rese conto che la prima frase era difficile da capire.Così, il chiarimento:

Una molto buona abitudine, se avete intenzione di scrivere un web accessibile al pubblico servizio, è quello di rendere il vostro schema di documento è disponibile al URL che è possibile utilizzare per lo schema URI dello spazio dei nomi-o, meglio, hanno l'URL sarà un link per la documentazione completa (W3C XSD spazio dei nomi è di per sé un buon esempio: http://www.w3.org/2001/XMLSchema).

Altri suggerimenti

Io suggerirei di scrivere fagioli a mano, e solo l'annotazione con JAXB annotazioni, se è necessario.Per la maggior parte delle funzioni di accesso/mutator (getter/setter) non è necessario;per impostazione predefinita, tutti i pubblici bean funzioni di accesso e i campi sono considerati, il nome è derivato utilizzando bean convenzione, e di default è quello di utilizzare elementi invece di attributi, in modo che gli attributi devono essere annotate).

In alternativa è possibile, naturalmente, scrivere schema a mano, generare grani con JAXB, se vi piace il W3C Schema molto.E basta usare il codice risultante, non per lo schema, per l'associazione dati.

Come per POJO:che può essere molto semplice.Qualcosa di simile a:

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

e allo stesso modo per gli altri.Oppure, utilizzare metodi getter/setter se ti piacciono e non la mente un po di più di verbosità.Questi sono solo contenitori di dati, non c'è bisogno di ottenere troppo di fantasia.

E se si deve auto-detect tipo di contenuto, considerare l'utilizzo di Stax parser per vedere che cosa l'elemento principale, e quindi associare utilizzando JAXB Unmarshaller, consegna XMLStreamReader che indica che l'elemento principale.In questo modo si può passare diverso tipo di oggetto da associare.

E infine:invio/ricezione di richieste:pianura vecchio HttpURLConnection funziona bene per richieste GET e POST (costruire utilizzando, ad esempio, l'URL.openConnection()).Jakarta HttpClient ha più funzioni, se necessario.In modo che, spesso, non si ha realmente bisogno di un separato RESTO client, potrebbe tornare utile, ma in generale di costruire su semplice client http pezzi.

Trovo HTTP4E molto utile per fare le chiamate di RESTO.È un fantastico plugin di Eclipse, ha schede, la colorazione della sintassi, auto suggerire, generazione di codice, RESTO chiamata HTTP replay, ecc..Si fa un grande lavoro di HTTP debug, HTTP manomissione, l'hacking.Mi sto divertendo molto con esso.

http://www.ywebb.com/

Provare JdkRequest da jcabi-http (Io sono uno sviluppatore).Questo è come funziona:

String body = new JdkRequest("http://www.google.com")
  .header("User-Agent", "it's me")
  .fetch()
  .body()

Controllare questo post per ulteriori dettagli: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top