Вопрос-ответ

How do you create a REST client for Java? [closed]

Как создать REST-клиент для Java?

Благодаря JSR 311 и его реализациям у нас есть мощный стандарт для предоставления доступа к объектам Java через REST. Однако на стороне клиента, похоже, чего-то не хватает, что сопоставимо с Apache Axis для SOAP - чего-то, что скрывает веб-службу и прозрачно маршалирует данные обратно в объекты Java.

Как создать клиенты Java RESTful? Используя HttpConnection и ручной синтаксический анализ результата? Или специализированные клиенты, например, для Jersey или Apache CXR?

Переведено автоматически
Ответ 1

Это старый вопрос (2008), поэтому сейчас вариантов намного больше, чем было тогда:

ОБНОВЛЕНИЯ (проекты все еще активны в 2020 году):


  • Apache HTTP Components (4.2) Fluent adapter - базовая замена JDK, используемая несколькими другими кандидатами в этом списке. Лучше, чем старый Commons HTTP Client 3, и проще в использовании для создания собственного REST-клиента. Вам придется использовать что-то вроде Jackson для поддержки синтаксического анализа JSON, и вы можете использовать HTTP-компоненты UriBuilder для создания URI ресурсов, похожих на Rest-клиент Jersey / JAX-RS. HTTP components также поддерживает NIO, но я сомневаюсь, что вы получите лучшую производительность, чем BIO, учитывая короткую природу запроса REST. Apache HttpComponents 5 поддерживает HTTP / 2.

  • OkHttp - базовая замена JDK, аналогичная http-компонентам, используемая несколькими другими кандидатами в этом списке. Поддерживает более новые HTTP-протоколы (SPDY и HTTP2). Работает на Android. К сожалению, он не предлагает асинхронную опцию на основе реального цикла реактора (см. Компоненты Ning и HTTP выше). Однако, если вы используете более новый протокол HTTP2, это не такая проблема (при условии, что количество подключений является проблемой).

  • Ning Async-http-клиент - обеспечивает поддержку NIO. Ранее известный как Асинхронный http-клиент по Sonatype.

  • Симулируйте оболочку для http-клиентов более низкого уровня (okhttp, apache httpcontents). Автоматически создает клиенты на основе заглушек интерфейса, похожих на некоторые расширения Jersey и CXF. Сильная интеграция spring.

  • Retrofit - оболочка для http-клиентов более низкого уровня (okhttp). Автоматически создает клиентов на основе заглушек интерфейса, похожих на некоторые расширения Jersey и CXF.

  • Volley оболочка для http-клиента jdk, от Google

  • google-http оболочка для http-клиента jdk или apache httpcontents от Google

  • Unirest оболочка для http-клиента jdk, автор kong

  • Resteasy JakartaEE-оболочка для http-клиента jdk от jboss, часть jboss framework

  • jcabi-http оболочка для apache httpcontents, часть коллекции jcabi

  • restlet оболочка для apache httpcontents, часть restlet framework

  • rest-assured оболочка с утверждениями для удобства тестирования

Предостережение при выборе HTTP / REST-клиентов. Обязательно проверьте, что ваш стек фреймворка использует для HTTP-клиента, как он выполняет потоковую передачу, и в идеале используйте тот же клиент, если он его предлагает. То есть, если вы используете что-то вроде Vert.x или Play, вы можете попробовать использовать его резервный клиент для участия в любом цикле шины или реактора, который предоставляет фреймворк ... в противном случае будьте готовы к возможным интересным проблемам с потоковой обработкой.

Ответ 2

Как я упоминал в этой теме, я обычно использую Jersey, который реализует JAX-RS и поставляется с хорошим REST-клиентом. Приятно то, что если вы реализуете свои ресурсы RESTful с использованием JAX-RS, то клиент Jersey может повторно использовать поставщиков сущностей, таких как для JAXB / XML / JSON / Atom и так далее - так что вы можете повторно использовать те же объекты на стороне сервера, которые вы используете в модульном тестировании на стороне клиента.

Например, вот пример модульного тестирования из проекта Apache Camel, который ищет полезные нагрузки XML из ресурса RESTful (используя конечные точки объекта JAXB). Метод resource(uri) определен в этом базовом классе, который просто использует Jersey client API.

например

clientConfig = new DefaultClientConfig();
client = Client.create(clientConfig);

resource = client.resource("http://localhost:8080");
// let's get the XML as a String
String text = resource("foo").accept("application/xml").get(String.class);

Кстати, я надеюсь, что будущие версии JAX-RS добавят хороший клиентский API, аналогичный тому, что есть в Джерси.

Ответ 3

Вы можете использовать стандартные Java SE API:

private void updateCustomer(Customer customer) { 
try {
URL url = new URL("http://www.example.com/customers");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("PUT");
connection.setRequestProperty("Content-Type", "application/xml");

OutputStream os = connection.getOutputStream();
jaxbContext.createMarshaller().marshal(customer, os);
os.flush();

connection.getResponseCode();
connection.disconnect();
} catch(Exception e) {
throw new RuntimeException(e);
}
}

Или вы можете использовать REST client API, предоставляемые реализациями JAX-RS, такими как Jersey. Эти API проще в использовании, но требуют дополнительных jar в вашем пути к классу.

WebResource resource = client.resource("http://www.example.com/customers"); 
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer.");
System.out.println(response);

Для получения дополнительной информации смотрите:

Ответ 4

Если вы хотите только вызвать REST-сервис и проанализировать ответ, вы можете попробовать будьте уверены

// Make a GET request to "/lotto"
String json = get("/lotto").asString()
// Parse the JSON response
List<String> winnderIds = with(json).get("lotto.winners.winnerId");

// Make a POST request to "/shopping"
String xml = post("/shopping").andReturn().body().asString()
// Parse the XML
Node category = with(xml).get("shopping.category[0]");
java rest