Вопрос

Цель

Java-клиент для HotJobs от Yahoo Возобновить поиск по REST API.

Предыстория

Я привык писать клиенты веб-сервисов для SOAP API, где wсимпорт генерирует заглушки прокси-сервера, и вы готовы к работе.Но это REST API, который является новым для меня.

Подробные сведения

Прогресс

Я посмотрел на вопрос Клиенты Rest для Java?, но автоматизированные решения там предполагают, что вы предоставляете как сервер, так и клиент, причем JAXB вызывается в POJOs для генерации схемы и REST API.

Используя ДжерсиJAX-RS реализация), я смог выполнить 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

Ответ может выглядеть следующим образом:

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

Или это может выглядеть так:

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

Вопросы

  • Есть ли способ автоматической генерации ПОХОс что может быть маршалировано / отменено без формальной схемы?
  • Должен ли я попытаться сгенерировать эти POJO вручную, с помощью ДЖАКСБ примечания?
  • Есть ли какой-нибудь инструмент, который я должен использовать, чтобы мне не приходилось делать все это вручную?
Это было полезно?

Решение

Интересно, что они предоставляют HTTP-URL в качестве URI пространства имен для схемы, но на самом деле не сохраняют там свою схему.Это может быть оплошностью с их стороны, которую можно исправить с помощью электронного письма или публикации в списке обсуждений.

Один из подходов заключается в создании вашей собственной схемы, но это кажется большой работой с небольшой отдачей.Учитывая, насколько просты сообщения, мне интересно, нужен ли вам вообще POJO, чтобы обернуть их?Почему бы просто не создать обработчик, который извлекает нужные вам данные с помощью XPath?


Редактировать:взрыв из прошлого, но я увидел комментарий, перечитал вопрос и понял, что первое предложение было трудным для понимания.Итак, уточнение:

Одна очень хорошая привычка, если вы собираетесь написать общедоступный веб-сервис, - сделать документ вашей схемы доступным по тому же URL, который вы используете для URI пространства имен схемы, или, что еще лучше, пусть этот URL будет ссылкой на полную документацию (пространство имен W3C XSD само по себе является хорошим примером: http://www.w3.org/2001/XMLSchema).

Другие советы

Я бы предложил писать beans вручную и комментировать только аннотациями JAXB, если это необходимо.Для большинства средств доступа / мутаторов (геттеров / сеттеров) вам не нужно;по умолчанию рассматриваются все общедоступные средства доступа к компонентам и полям, имя выводится с использованием соглашения о компонентах, и по умолчанию вместо атрибутов используются элементы (поэтому атрибуты должны быть аннотированы).

В качестве альтернативы вы, конечно, можете написать схему вручную, сгенерировать компоненты с помощью JAXB, если вам очень нравится схема W3C.И просто используйте результирующий код, а не схему, для привязки данных.

Что касается POJO:это может быть очень просто.Что -то вроде:

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

и аналогично для других.Или используйте геттеры / сеттеры, если они вам нравятся и вы не возражаете против большей детализации.Это всего лишь контейнеры с данными, не нужно слишком фантазировать.

И если вам необходимо автоматически определять тип из содержимого, рассмотрите возможность использования Stax parser, чтобы увидеть, что такое корневой элемент, а затем привязать с помощью JAXB Unmarshaller, передавая XMLStreamReader, который указывает на этот корневой элемент.Таким образом, вы можете передать другой тип объекта для привязки.

И, наконец,:отправка / получение запросов:обычный старый HttpURLConnection работает нормально для запросов GET и POST (создается, скажем, с использованием URL.openConnection()).Jakarta HttpClient имеет дополнительные функции, если это необходимо.Поэтому часто вам на самом деле не нужен отдельный клиент REST - они могут пригодиться, но обычно строятся на простых элементах http-клиента.

Я нахожу HTTP4E очень полезным для выполнения вызовов REST.Это потрясающий плагин Eclipse, в нем есть вкладки, раскраска синтаксиса, автоматическое предложение, генерация кода, повтор HTTP-вызова REST и т.д..Он отлично справляется с отладкой HTTP, подделкой HTTP, взломом.Мне это доставляет такое удовольствие.

http://www.ywebb.com/

Попробуй JdkRequest От jcabi-http (Я разработчик).Вот как это работает:

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

Проверьте это сообщение в блоге для получения более подробной информации: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top