Я собираюсь сделать RESTful-вызов в Java. Однако я не знаю, как сделать звонок. Нужно ли использовать URLConnection или другие? Может кто-нибудь помочь мне. Спасибо.
Это зависит от того, как вы делаете остальные звонки в вашем приложении. Используете ли вы реализацию JaxRS? Конкретный? Вы делаете запросы вручную?
Колин Хеберт,
@ Колин Хеберт, спасибо за ваш ответ. Но я понятия не имею о вызове RESTful. Не могли бы вы дать мне больше информации о различных частях вызова RESTful.
Если вы звоните в службу RESTful от поставщика услуг (например, Facebook, Twitter), вы можете сделать это с любым вкусом по вашему выбору:
Если вы не хотите использовать внешние библиотеки, вы можете использовать java.net.HttpURLConnectionили javax.net.ssl.HttpsURLConnection(для SSL), но это вызов, инкапсулированный в шаблон типа Factory в java.net.URLConnection. Чтобы получить результат, вам нужно будет connection.getInputStream()вернуть вам InputStream. Затем вам нужно будет преобразовать ваш входной поток в строку и проанализировать строку в ее представительном объекте (например, XML, JSON и т. Д.).
Кроме того, Apache HttpClient ( последняя версия 4). Он более стабилен и надежен, чем Java по умолчанию, URLConnectionи поддерживает большинство (если не все) HTTP-протокол (а также его можно установить в строгом режиме). Ваш ответ все еще будет, InputStreamи вы можете использовать его, как указано выше.
Не изобретайте колесо, используйте одну из существующих реализаций RESTful.
Qwerky
13
Я не изобретаю велосипед, я говорю, что вы можете использовать все, flavourчто захотите. Некоторые хотят по умолчанию URLConnection, некоторые хотят HttpClient. В любом случае, это для вас.
Бухаке Синди
@ Элитный джентльмен, спасибо за ваш ответ. После проверки всей библиотеки, я хочу использовать Apache HttpClient, не могли бы вы дать мне дополнительную информацию об этом?
Вопросы
@Questions, ссылка на примеры HttpClient 4, кажется, не работает, поэтому, если у вас есть какие-либо вопросы (каламбур ... лол), дайте мне знать ... Я занимаюсь этим почти ежедневно.
Бухаке Синди
Пожалуйста, покажите пример кода того, как использовать эти классы, а не просто отметьте их существование
Джонатан
150
Обновить: Прошло почти 5 лет с тех пор, как я написал ответ ниже; сегодня у меня другая точка зрения.
В 99% случаев, когда люди используют термин REST, они действительно означают HTTP; они могут меньше заботиться о «ресурсах», «представлениях», «передачах состояний», «унифицированных интерфейсах», «гипермедиа» или любых других ограничениях или аспектах стиля архитектуры REST, определенных Fielding . Поэтому абстракции, предоставляемые различными средами REST, сбивают с толку и бесполезны.
Итак: вы хотите отправлять HTTP-запросы с использованием Java в 2015 году. Вам нужен API, который будет понятным, выразительным, интуитивно понятным, идиоматическим, простым. Что использовать? Я больше не использую Java, но последние несколько лет клиентская библиотека Java HTTP, которая показалась наиболее перспективной и интересной, - это OkHttp . Проверьте это.
Вы можете определенно взаимодействовать с веб-сервисами RESTful, используя URLConnectionили HTTPClient для кодирования HTTP-запросов.
Однако, как правило, более желательно использовать библиотеку или инфраструктуру, которая предоставляет более простой и более семантический API, специально разработанный для этой цели. Это облегчает написание, чтение и отладку кода и уменьшает дублирование усилий. Эти структуры обычно реализуют некоторые замечательные функции, которые не обязательно присутствуют или которые легко использовать в библиотеках более низкого уровня, такие как согласование содержимого, кэширование и аутентификация.
Form form =newForm();
form.add("x","foo");
form.add("y","bar");ClientResource resource =newClientResource("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, но у меня сложилось впечатление, что они оба также являются солидным выбором.
Но все равно отличный пост. И я должен согласиться с тем, что «в 99% случаев, когда люди используют термин REST, они действительно означают HTTP; ... Поэтому абстракции, предоставляемые различными средами REST, сбивают с толку и бесполезны».
AlexD
2
В вашем примере на Джерси, где / как используется объект Form? Он создан, но, похоже, ничего не добавляет к примеру.
Splunbob
29
Это очень сложно в Java, поэтому я бы предложил использовать RestTemplateабстракцию Spring :
String result =
restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}",String.class,"42","21");
Есть несколько действительно хороших API REST, я бы рекомендовал использовать один, а не изобретать велосипед.
Qwerky
как я сказал: сложный как ад. (нет, я не понизил это, это совершенно правильное решение)
Шон Патрик Флойд,
4
@Qwerky Клиентские API-библиотеки обычно являются нарушением ограничений REST. Они вводят слишком много связи. Использование хорошей библиотеки HTTP - намного лучший вариант в долгосрочной перспективе.
Даррел Миллер
10
Есть несколько RESTful API вокруг. Я бы порекомендовал Джерси;
Вы можете проверить CXF . Вы можете посетить статью JAX-RS здесь
Вызов так же прост (цитата):
BookStore store =JAXRSClientFactory.create("http://bookstore.com",BookStore.class);// (1) remote GET call to http://bookstore.com/bookstoreBooks books = store.getAllBooks();// (2) no remote callBookResource subresource = store.getBookSubresource(1);// {3} remote GET call to http://bookstore.com/bookstore/1Book b = subresource.getDescription();
Наиболее простым решением будет использование клиентской библиотеки Apache http. см. следующий пример кода. этот код использует базовую безопасность для аутентификации.
Ответы:
Если вы звоните в службу RESTful от поставщика услуг (например, Facebook, Twitter), вы можете сделать это с любым вкусом по вашему выбору:
Если вы не хотите использовать внешние библиотеки, вы можете использовать
java.net.HttpURLConnection
илиjavax.net.ssl.HttpsURLConnection
(для SSL), но это вызов, инкапсулированный в шаблон типа Factory вjava.net.URLConnection
. Чтобы получить результат, вам нужно будетconnection.getInputStream()
вернуть вамInputStream
. Затем вам нужно будет преобразовать ваш входной поток в строку и проанализировать строку в ее представительном объекте (например, XML, JSON и т. Д.).Кроме того, Apache HttpClient ( последняя версия 4). Он более стабилен и надежен, чем Java по умолчанию,
URLConnection
и поддерживает большинство (если не все) HTTP-протокол (а также его можно установить в строгом режиме). Ваш ответ все еще будет,InputStream
и вы можете использовать его, как указано выше.Документация по HttpClient: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html
источник
flavour
что захотите. Некоторые хотят по умолчаниюURLConnection
, некоторые хотятHttpClient
. В любом случае, это для вас.Обновить: Прошло почти 5 лет с тех пор, как я написал ответ ниже; сегодня у меня другая точка зрения.
В 99% случаев, когда люди используют термин REST, они действительно означают HTTP; они могут меньше заботиться о «ресурсах», «представлениях», «передачах состояний», «унифицированных интерфейсах», «гипермедиа» или любых других ограничениях или аспектах стиля архитектуры REST, определенных Fielding . Поэтому абстракции, предоставляемые различными средами REST, сбивают с толку и бесполезны.
Итак: вы хотите отправлять HTTP-запросы с использованием Java в 2015 году. Вам нужен API, который будет понятным, выразительным, интуитивно понятным, идиоматическим, простым. Что использовать? Я больше не использую Java, но последние несколько лет клиентская библиотека Java HTTP, которая показалась наиболее перспективной и интересной, - это OkHttp . Проверьте это.
Вы можете определенно взаимодействовать с веб-сервисами RESTful, используя
URLConnection
или HTTPClient для кодирования HTTP-запросов.Однако, как правило, более желательно использовать библиотеку или инфраструктуру, которая предоставляет более простой и более семантический API, специально разработанный для этой цели. Это облегчает написание, чтение и отладку кода и уменьшает дублирование усилий. Эти структуры обычно реализуют некоторые замечательные функции, которые не обязательно присутствуют или которые легко использовать в библиотеках более низкого уровня, такие как согласование содержимого, кэширование и аутентификация.
Некоторые из наиболее зрелых вариантов Джерси , RESTEasy и Restlet .
Я больше всего знаком с Рестлет и Джерси, давайте посмотрим, как мы могли бы сделать
POST
запрос с обоими API.Пример Джерси
Пример рестлета
Конечно, запросы GET еще проще, и вы также можете указывать такие вещи, как теги сущностей и
Accept
заголовки, но, надеюсь, эти примеры полезны нетривиально, но не слишком сложно.Как видите, Рестлет и Джерси имеют похожие клиентские API. Я считаю, что они были разработаны примерно в одно и то же время, и поэтому влияли друг на друга.
Я считаю, что API-интерфейс Restlet немного более семантический, и, следовательно, немного более понятный, но YMMV.
Как я уже сказал, я больше всего знаком с Restlet, я использовал его во многих приложениях в течение многих лет, и я очень доволен этим. Это очень зрелая, надежная, простая, эффективная, активная и хорошо поддерживаемая среда. Я не могу говорить с Джерси или RESTEasy, но у меня сложилось впечатление, что они оба также являются солидным выбором.
источник
Это очень сложно в Java, поэтому я бы предложил использовать
RestTemplate
абстракцию Spring :Ссылка:
RestTemplate
источник
Если вам просто нужно сделать простой вызов службы REST из Java, вы используете что-то вроде этого
источник
Есть несколько RESTful API вокруг. Я бы порекомендовал Джерси;
https://jersey.java.net/
Документация по клиентскому API находится здесь;
https://jersey.java.net/documentation/latest/index.html
Местоположение обновления для документов OAuth в приведенном ниже комментарии является неработающей ссылкой и перемещено по адресу https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334.
источник
Я хочу поделиться своим личным опытом вызова REST WS с вызовом Post JSON:
источник
Вы можете проверить CXF . Вы можете посетить статью JAX-RS здесь
Вызов так же прост (цитата):
источник
Действительно, это «очень сложно в Java»:
От: https://jersey.java.net/documentation/latest/client.html
источник
Наиболее простым решением будет использование клиентской библиотеки Apache http. см. следующий пример кода. этот код использует базовую безопасность для аутентификации.
Добавьте следующую зависимость.
источник
Я вижу много ответов, вот что мы используем в 2020 году WebClient , и BTW RestTemplate будет объявлен устаревшим. (можете проверить это) RestTemplate будет объявлен устаревшим
источник
Вы можете использовать Async Http Client (библиотека также поддерживает протокол WebSocket ), например:
источник