Pergunta

Meta

cliente Java para HotJobs Currículo Pesquisar API REST do Yahoo.

Fundo

Eu estou acostumado a escrever clientes de serviços web para APIs de SOAP, onde wsimport gera stubs de proxy e você está fora e correndo. Mas esta é uma API REST, que é novo para mim.

Detalhes

Progress

Eu olhei questão clientes REST para Java? , mas as soluções automatizadas não supor que você estão fornecendo tanto o servidor eo cliente, com JAXB invocado em POJOs para gerar um esquema e uma API REST.

Usando Jersey (a implementação JAX-RS ), eu tenho sido capaz de fazer uma solicitação 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

A resposta pode ser semelhante a:

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

Ou, pode ser parecido:

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

Perguntas

  • Existe uma maneira para gerar automaticamente POJOs que pode ser comandada / unmarshalled sem esquema formal?
  • Eu deveria tentar gerar esses POJOs à mão, com JAXB anotações?
  • Existe alguma ferramenta que eu deveria estar aproveitando então eu não tenho que fazer tudo isso manualmente?
Foi útil?

Solução

É interessante que eles fornecem uma URL HTTP como o namespace URI para o esquema, mas não realmente salvar seu esquema lá. Isso poderia ser um descuido de sua parte, que um e-mail ou discussão lista de postagem poderia corrigir.

Uma abordagem é criar o seu próprio esquema, mas este parece ser um monte de trabalho para pouco retorno. Dado o quão simples as mensagens são, gostaria de saber se você precisa mesmo de um POJO para envolvê-los? Porque não basta ter um manipulador que extrai os dados de que precisa usando XPath?


Edit: explosão do passado, mas eu vi o comentário, releia a questão, e percebeu que a primeira sentença era difícil de entender. Assim, o esclarecimento:

Um hábito muito bom, se você estiver indo para escrever um serviço web de acesso público, é fazer o seu documento de esquema disponível no mesmo URL que você usa para namespace URI do esquema - ou melhor, tem que ser um URL link para a documentação completa (o namespace W3C XSD é em si um bom exemplo: http://www.w3.org / 2001 / XMLSchema ).

Outras dicas

Eu sugeriria escrevendo feijão à mão, e apenas anotando com anotações JAXB se você tiver que. Para a maioria dos acessadores / Mutators (getters / setters), você não precisa; por padrão todos os acessores de feijão e campos públicos são considerados, o nome é derivado usando convenção de feijão e padrão é usar elementos em vez de atributos (assim atributos precisam ser anotada).

Como alternativa, você pode, naturalmente, esquema de escrita à mão, gerar feijão usando JAXB, se você gosta de W3C Schema muito. E apenas usar o código resultante, não do esquema, para a ligação de dados.

Quanto ao POJO: que pode ser muito simples. Algo como:

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

e da mesma forma para outros. Ou, use getters / setters se você gosta deles e não se importa pouco mais detalhamento. Estes são apenas recipientes de dados, há necessidade de ficar muito extravagante.

E se você tem auto-detectar o tipo de conteúdo, considere o uso analisador Stax para ver o que o elemento de raiz, e depois ligam usando JAXB unmarshaller, entregando XMLStreamReader que aponta para esse elemento raiz. Dessa forma, você pode passar diferente tipo de objeto para vincular a.

E finalmente: enviar / pedidos que recebem: planície HttpURLConnection velho funciona ok para solicitações GET e POST (construção utilizando, por exemplo, URL.openConnection ()). Jakarta HttpClient tem mais recursos se for necessário. Então muitas vezes você realmente não precisa de um cliente REST separado - que pode vir a calhar, mas geralmente construir peças cliente HTTP simples

.

Eu acho HTTP4E muito útil para fazer chamadas REST. É um plugin do Eclipse incrível, tem abas, coloração de sintaxe, auto sugerem, geração de código, REST HTTP chamada de repetição, etc .. Ele faz um grande trabalho de HTTP de depuração, HTTP adulteração, hacking. Estou me divertindo muito com ele.

http://www.ywebb.com/

Tente JdkRequest de jcabi-http (Eu sou um desenvolvedor). É assim que funciona:

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

Verifique este post para mais detalhes: http: // www.yegor256.com/2014/04/11/jcabi-http-intro.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top