Question

Objectif

Java client HotJobs de Yahoo Resumé Recherche API REST .

Arrière-plan

Je suis habitué à écrire des clients de services Web pour les API SOAP, où wsimport génère des talons proxy et vous êtes hors et courir. Mais ceci est une API REST, ce qui est nouveau pour moi.

Détails

Progrès

Je regardais à la question clients Rest pour Java? , mais les solutions automatisées il suppose que vous procurent à la fois le serveur et le client, avec JAXB invoqué sur POJO pour générer un schéma et une API REST.

Utilisation Jersey (a JAX-RS de mise en œuvre), je suis en mesure de faire une demande manuelle 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 réponse peut ressembler à:

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

Ou, il peut ressembler à:

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

Questions

Était-ce utile?

La solution

Il est intéressant qu'ils fournissent une URL HTTP comme l'espace de noms URI du schéma, mais ne sauvent pas réellement leur schéma là. Cela pourrait être un oubli de leur part, qu'un affichage liste de discussion électronique ou pourrait corriger.

Une approche est de créer votre propre schéma, mais cela semble être beaucoup de travail pour peu de retour. Compte tenu de la simplicité des messages sont, je me demande si vous avez besoin même un POJO pour les envelopper? Pourquoi ne pas avoir juste un gestionnaire qui extrait les données dont vous avez besoin en utilisant XPath?


Edit: souffle du passé, mais j'ai vu le commentaire, relisez la question et se rendit compte que la première phrase était difficile à comprendre. Donc, la clarification:

Une très bonne habitude, si vous allez écrire un service Web accessible au public, est de rendre votre document de schéma disponible à la même URL que vous utilisez pour URI d'espace de nom du schéma - ou mieux, ont cette URL être un lien vers une documentation complète (l'espace de noms W3C XSD lui-même est un bon exemple: http://www.w3.org / 2001 / XMLSchema).

Autres conseils

Je suggère d'écrire des haricots à la main, et seulement avec annotations JAXB annoter si vous devez. Pour la plupart des accesseurs / modifieurs (getters / setters) vous n'avez pas; par défaut, tous les accesseurs de haricots publics et les champs sont considérés, le nom est dérivé en utilisant la convention de haricot, et par défaut est d'utiliser des éléments au lieu des attributs (si les attributs doivent être annotée).

Vous pouvez aussi bien sûr schéma d'écriture à la main, générer des haricots en utilisant JAXB, si vous aimez Schema du W3C beaucoup. Et utiliser simplement le code résultant, pas le schéma, pour la liaison de données.

Quant à POJO: cela peut être très simple. Quelque chose comme:

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

et de même pour d'autres. Ou, utilisez getters / setters si vous les aimez et ne me dérange pas peu plus verbosité. Ce ne sont que des conteneurs de données, pas besoin d'obtenir trop de fantaisie.

Et si vous devez taper la détection automatique de contenu, pensez à utiliser l'analyseur Stax pour voir ce que l'élément racine, et lier ensuite en utilisant JAXB unmarshaller, la remise XMLStreamReader qui pointe vers cet élément racine. De cette façon, vous pouvez passer différents types d'objet à lier.

Et enfin: envoi / réception des demandes: Travaux vieux HttpURLConnection simple ok pour GET et POST demandes (construction en utilisant, par exemple, URL.openConnection ()). Jakarta HttpClient a plus de fonctionnalités si besoin. Donc, souvent, vous ne avez pas vraiment besoin d'un client distinct REST - ils peuvent être utiles, mais construire généralement sur des morceaux de clients simples http

.

Je trouve HTTP4E très utile pour faire des appels REST. Il est un plugin Eclipse impressionnant, il a des onglets, coloration syntaxique, auto, génération suggèrent de code, REST replay appel HTTP, etc .. Il fait un excellent travail de débogage HTTP, HTTP trafiquer, le piratage. Je suis tellement amusé avec.

http://www.ywebb.com/

Essayez de JdkRequest rel="nofollow"> jcabi-http (Je suis un développeur). Voici comment cela fonctionne:

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

Vérifier ce billet de blog pour plus de détails: http: // www.yegor256.com/2014/04/11/jcabi-http-intro.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top