Как создать REST-клиент для Java?
Благодаря JSR 311 и его реализациям у нас есть мощный стандарт для предоставления доступа к объектам Java через REST. Однако на стороне клиента, похоже, чего-то не хватает, что сопоставимо с Apache Axis для SOAP - чего-то, что скрывает веб-службу и прозрачно маршалирует данные обратно в объекты Java.
Как создать клиенты Java RESTful? Используя HttpConnection и ручной синтаксический анализ результата? Или специализированные клиенты, например, для Jersey или Apache CXR?
Переведено автоматически
Ответ 1
Это старый вопрос (2008), поэтому сейчас вариантов намного больше, чем было тогда:
- Apache CXF имеет три разных варианта REST-клиента
- Джерси (упоминалось выше).
- Spring RestTemplate заменен Spring WebClient
- HTTP-клиент Commons создайте свой собственный для старых Java-проектов.
ОБНОВЛЕНИЯ (проекты все еще активны в 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]");