Обновление: Прошло почти 5 лет с тех пор, как я написал ответ ниже; сегодня у меня другая точка зрения.
99% случаев, когда люди используют термин REST, они действительно означают HTTP; они могли бы меньше заботиться о «ресурсах», «представлениях», «передачах состояний», «унифицированных интерфейсах», «гипермедиа» или любых других ограничениях или аспектах стиля архитектуры REST, определенных Fielding . Поэтому абстракции, предоставляемые различными средами REST, сбивают с толку и бесполезны.
Итак: вы хотите отправлять HTTP-запросы с использованием Java в 2015 году. Вам нужен API, который будет понятным, выразительным, интуитивно понятным, идиоматическим, простым. Что использовать? Я больше не использую Java, но за последние несколько лет клиентская библиотека Java HTTP, которая показалась наиболее перспективной и интересной, - OkHttp . Проверьте это.
Определенно вы можете взаимодействовать с веб-службами RESTful, используя URLConnection
или HTTPClient для кодирования HTTP-запросов.
Однако, как правило, более желательно использовать библиотеку или среду, которая предоставляет более простой и более семантический API, специально разработанный для этой цели. Это облегчает написание, чтение и отладку кода и уменьшает дублирование усилий. Эти структуры обычно реализуют некоторые замечательные функции, которые не обязательно присутствуют или которые легко использовать в библиотеках более низкого уровня, такие как согласование содержимого, кэширование и аутентификация.
Некоторые из наиболее зрелых вариантов: Джерси , RESTEasy и Restlet .
Я больше всего знаком с Рестлетом и Джерси, давайте посмотрим, как мы сделаем запрос POST
с обоими API.
Пример из Джерси
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
Client client = ClientBuilder.newClient();
WebTarget resource = client.target("http://localhost:8080/someresource");
Builder request = resource.request();
request.accept(MediaType.APPLICATION_JSON);
Response response = request.get();
if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity());
}
Пример рестлета
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
ClientResource resource = new ClientResource("http://localhost:8080/someresource");
Response response = resource.post(form.getWebRepresentation());
if (response.getStatus().isSuccess()) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity().getText());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity().getText());
}
Конечно, GET-запросы еще проще, и вы также можете указывать такие вещи, как теги сущностей и Accept
заголовки, но, надеюсь, эти примеры полезны, но не слишком сложны.
Как видите, Рестлет и Джерси имеют похожие клиентские API. Я считаю, что они были разработаны примерно в одно и то же время и поэтому влияли друг на друга.
API Restlet мне кажется немного более семантическим и, следовательно, немного более понятным, но YMMV.
Как я уже сказал, я больше всего знаком с Restlet, я использовал его во многих приложениях в течение многих лет, и я очень доволен этим. Это очень зрелая, надежная, простая, эффективная, активная и хорошо поддерживаемая среда. Я не могу говорить с Джерси или RESTEasy, но у меня сложилось впечатление, что они оба также являются солидным выбором.