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), поэтому сейчас вариантов намного больше, чем было тогда:
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, это не такая проблема (при условии, что количество подключений является проблемой).
Симулируйте оболочку для http-клиентов более низкого уровня (okhttp, apache httpcontents). Автоматически создает клиенты на основе заглушек интерфейса, похожих на некоторые расширения Jersey и CXF. Сильная интеграция spring.
Retrofit - оболочка для http-клиентов более низкого уровня (okhttp). Автоматически создает клиентов на основе заглушек интерфейса, похожих на некоторые расширения Jersey и CXF.
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 и так далее - так что вы можете повторно использовать те же объекты на стороне сервера, которые вы используете в модульном тестировании на стороне клиента.
resource = client.resource("http://localhost:8080"); // let's get the XML as a String Stringtext= resource("foo").accept("application/xml").get(String.class);
Кстати, я надеюсь, что будущие версии JAX-RS добавят хороший клиентский API, аналогичный тому, что есть в Джерси.
Или вы можете использовать REST client API, предоставляемые реализациями JAX-RS, такими как Jersey. Эти API проще в использовании, но требуют дополнительных jar в вашем пути к классу.
Если вы хотите только вызвать REST-сервис и проанализировать ответ, вы можете попробовать будьте уверены
// Make a GET request to "/lotto" Stringjson= get("/lotto").asString() // Parse the JSON response List<String> winnderIds = with(json).get("lotto.winners.winnerId");
// Make a POST request to "/shopping" Stringxml= post("/shopping").andReturn().body().asString() // Parse the XML Nodecategory= with(xml).get("shopping.category[0]");