Java REST client sans schéma
Objectif
Client Java pour Yahoo HotJobs Cv de Recherche de l'API REST.
Fond
Je suis habitué à l'écriture web-service clients pour l'Api SOAP, où wsimport génère proxy talons et vous êtes opérationnel. Mais c'est une API REST, ce qui est nouveau pour moi.
Détails
- RESTE API
- Pas WADL
- Formel n'a pas de schéma XML (XSD ou fichiers DTD). Il y a exemple de demande XML/réponse paires.
- Pas d'exemple de code fourni
Progrès
J'ai regardé à la question Le repos des clients pour Java?mais les solutions automatisées, il suppose que vous êtes offrant à la fois le serveur et le client, avec JAXB invoquée sur Pojo de générer un schéma et une API REST.
À l'aide de Jersey (un JAX-RS mise en œuvre), j'ai été capable de faire un manuel de la requête 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
- Est-il un moyen de générer automatiquement des Pojo qui peut être mobilisé l'/unmarshalled sans schéma?
- Devrais-je tenter de produire ces objets Pojo à la main, avec JAXB annotations?
- Est-il un outil que je devrais être en tirant parti donc je n'ai pas à faire tout cela manuellement?
source d'informationauteur Chase Seibert
Vous devez vous connecter pour publier un commentaire.
Il est intéressant qu'ils fournissent une URL HTTP, comme l'URI d'espace de noms pour le schéma, mais ne fait pas de sauver leur schéma. Qui pourrait être un oubli de leur part, un courriel ou une liste de discussion devrait se corriger.
Une approche consiste à créer votre propre schéma, mais cela semble être beaucoup de travail pour peu de retour. Compte tenu de la simplicité des messages, je me demande si vous avez encore besoin d'un POJO envelopper? Pourquoi ne pas simplement avoir un gestionnaire qui extrait les données dont vous avez besoin à l'aide de XPath?
Edit: blast from the past, mais j'ai vu le commentaire, relis la question et a réalisé que la première phrase est difficile à comprendre. Ainsi, la clarification:
Une très bonne habitude, si vous allez écrire un web accessible au public du service, est de faire de votre document de schéma disponible à la même adresse URL que vous utilisez pour le schéma de l'espace de noms URI -- ou mieux, faire en sorte que l'URL est un lien vers une documentation complète (le W3C XSD espace de noms est lui-même un bon exemple: http://www.w3.org/2001/XMLSchema).
Je suggère d'écrire des haricots à la main, et seulement en annotant avec des annotations JAXB si vous devez. Pour la plupart des accesseurs/mutateurs (getters/setters) vous ne devez pas; par défaut, tous les haricots accesseurs et les champs sont pris en considération, le nom est dérivé à l'aide de fèves de la convention, et la valeur par défaut est d'utiliser des éléments plutôt que des attributs (donc les attributs doivent être annotés).
Sinon, vous pouvez aussi écrire schéma à la main, de générer des haricots à l'aide de JAXB, si vous aimez le Schéma W3C beaucoup. Et il suffit d'utiliser résultant de code, pas de schéma, pour la liaison de données.
De POJO: qui peut être très simple. Quelque chose comme:
et de même pour d'autres. Ou, utiliser des getters/setters si vous les aimez et n'avez pas l'esprit peu plus de verbosité. Ce sont juste des conteneurs de données, pas besoin de trop de fantaisie.
Et si vous devez vous auto-détection du type de contenu, pensez à utiliser Stax analyseur de voir ce que l'élément racine, et ensuite les relier à l'aide de JAXB Unmarshaller, la remise XMLStreamReader que les points à celle de l'élément racine. De cette façon, vous pouvez passer les différents type d'objet à lier à.
Et enfin: envoyer/recevoir des demandes: plain old HttpURLConnection fonctionne bien pour GET et POST demandes (de construire à l'aide de, disons, de l'URL.openConnection()). Jakarta HttpClient a plus de fonctionnalités, si besoin est. Donc, souvent, vous n'avez pas vraiment besoin d'un client REST-ils peuvent venir dans maniable, mais reposent généralement sur simple client http morceaux.
Je trouve HTTP4E très utile pour faire des appels de REPOS. C'est un super plug-in Eclipse, il dispose d'onglets, la coloration de la syntaxe, de suggestion automatique, génération de code, RESTE HTTP appel de relecture, etc.. Il fait un excellent travail de HTTP débogage, HTTP falsification, le piratage. Je vais avoir tellement de plaisir avec elle.
http://www.ywebb.com/
Essayer
JdkRequest
de jcabi-http (je suis développeur). Voilà comment cela fonctionne:Vérifier ce blog pour plus de détails: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html