Java REST клиент без схемы - PullRequest
       28

Java REST клиент без схемы

10 голосов
/ 11 декабря 2008

Цель

Java-клиент для Yahoo HotJobs Resumé Search REST API .

Фон

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

Подробнее

Прогресс

Я посмотрел на вопрос Остальные клиенты для Java? , но автоматизированные решения предполагают, что вы предоставляете и сервер, и клиента, при этом JAXB вызывается на POJO для генерации схемы и 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 , которые можно маршалировать / распаковывать без формальной схемы?
  • Должен ли я попытаться сгенерировать эти POJO вручную с аннотациями JAXB ?
  • Есть ли какой-нибудь инструмент, который я должен использовать, чтобы мне не пришлось делать все это вручную?

Ответы [ 4 ]

3 голосов
/ 28 февраля 2009

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

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

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

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

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

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

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

3 голосов
/ 11 декабря 2008

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

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


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

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

1 голос
/ 15 июня 2009

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

http://www.ywebb.com/

0 голосов
/ 29 июня 2014

Попробуйте 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

...