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

Цель

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

Фон

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

Подробности

Прогресс

Я рассмотрел вопрос Остальные клиенты для Явы?, но автоматизированные решения предполагают, что вы предоставляете как сервер, так и клиент, а 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?
  • Есть ли какой-то инструмент, который я должен использовать, чтобы не делать все это вручную?
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
0
11 997
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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


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

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

Я пишу их поддержку API, чтобы увидеть, действительно ли существует схема. XPath кажется хрупким решением; как узнать, что нет новых XML-пакетов, которые мой XPath не обработает?

Chase Seibert 11.12.2008 18:43

Как вы будете обрабатывать любые новые элементы, если не знаете, что они из себя представляют, независимо от технологии? Если вы предполагаете некоторую работоспособность версии (т.е. они будут структурировать свои данные для разумной совместимости, так что ваш XPath по-прежнему будет работать), как это не решит проблему?

Will Hartung 28.02.2009 04:09

В итоге я использовал XML Spy для генерации схемы из примеров пакетов, а затем сгенерировал сопоставления для тех, кто использует JAXB. Несколько раз мне приходилось добавлять новую схему к примерам пакетов, а затем регенерировать схему и привязки JAXB.

Chase Seibert 04.07.2009 21:08

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

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

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

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

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

И если вы должны автоматически определять тип из содержимого, рассмотрите возможность использования синтаксического анализатора Stax, чтобы увидеть, что является корневым элементом, а затем выполнить привязку с помощью 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

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