REST клиенты для Java? - PullRequest
       65

REST клиенты для Java?

215 голосов
/ 21 октября 2008

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

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

Ответы [ 17 ]

179 голосов
/ 17 февраля 2011

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

ОБНОВЛЕНИЕ около 2014 года:

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

ОБНОВЛЕНИЕ 2016 :

  • OkHttp - Поддерживает более новые протоколы HTTP (SPDY и HTTP2). Работает на Android. К сожалению, он не предлагает истинную асинхронную опцию на основе реакторного контура (см. Выше компоненты Ning и HTTP). Однако, если вы используете более новый протокол HTTP2, это меньше проблем (при условии, что количество соединений является проблемой).
  • Модификация - Автоматически создает клиентов на основе заглушек интерфейса, аналогичных некоторым расширениям в Джерси и CXF. Использует OkHttp.
  • Apache HttpComponents 5 предположительно будет иметь поддержку HTTP2

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

70 голосов
/ 21 октября 2008

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

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

например.

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

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

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

60 голосов
/ 20 августа 2010

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

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); 
    } 
} 

Или вы можете использовать клиентские API REST, предоставляемые реализациями JAX-RS, такими как Джерси. Эти 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); 

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

11 голосов
/ 24 февраля 2011

Если вы хотите только вызвать службу 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]");
10 голосов
/ 21 октября 2008

Вы также можете проверить Restlet , который обладает полными возможностями на стороне клиента, более ориентирован на REST, чем библиотеки более низкого уровня, такие как HttpURLConnection или Apache HTTP Client (которые мы можем использовать в качестве соединителей).

С уважением, Джером Лувель

7 голосов
/ 03 сентября 2009

Вы можете попробовать Рапа . Дайте нам знать ваши отзывы о том же. И не стесняйтесь регистрировать проблемы или ожидаемые функции.

7 голосов
/ 07 июня 2014

Я недавно попробовал Дооснащение Библиотека из квадрата, это здорово, и вы можете легко вызывать API отдыха. Конфигурация на основе аннотаций позволяет нам избавиться от большого количества кодировки котельной плиты.

6 голосов
/ 25 декабря 2011

Я бы хотел указать еще 2 варианта:

5 голосов
/ 16 ноября 2015

OkHttp - легкий и мощный в сочетании с Retrofit. Это хорошо работает для общего использования Java, а также на Android.

OkHttp : http://square.github.io/okhttp/

public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

Дооснащение : http://square.github.io/retrofit/

public interface GitHubService {
  @GET("/users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}
5 голосов
/ 21 октября 2008

Я использую Apache HTTPClient для обработки всех аспектов HTTP.

Я пишу парсеры XML SAX для контента XML, который анализирует XML в вашей объектной модели. Я считаю, что Axis2 также предоставляет методы XML -> Model (Axis 1, к сожалению, скрыл эту часть) Генераторы XML тривиально просты.

Это не займет много времени для написания кода и, на мой взгляд, весьма эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...