Я собираюсь сделать RESTful-вызов в Java. Однако я не знаю, как позвонить. Нужно ли использовать URLConnection или другие? Может кто-нибудь мне помочь. спасибо.
RESTful вызов в Java
Ответ 1
Если вы вызываете услугу RESTful у поставщика услуг (например, Facebook, Twitter), вы можете сделать это с любым вкусом по вашему выбору:
Если вы не хотите использовать внешние библиотеки, вы можете использовать java.net.HttpURLConnection
или javax.net.ssl.HttpsURLConnection
(для SSL), но это вызов, заключенный в шаблон типа Factory в java.net.URLConnection
.
Чтобы получить результат, вы должны будете connection.getInputStream()
, который вернет вам InputStream
. Затем вам нужно будет преобразовать входной поток в строку и проанализировать строку в репрезентативном объекте (например, XML, JSON и т.д.).
В качестве альтернативы Apache HttpClient (версия 4 является последней). Он более стабильный и надежный, чем java default URLConnection
, и поддерживает большинство (если не всех) HTTP-протокол (а также его можно установить в режим Strict). Ваш ответ будет по-прежнему находиться в InputStream
, и вы можете использовать его, как указано выше.
Документация по HttpClient: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html
Ответ 2
Обновление: Прошло почти 5 лет с тех пор, как я написал ответ ниже; сегодня у меня другая перспектива.
99% времени, когда люди используют термин REST, они действительно означают HTTP; они могут меньше заботиться о "ресурсах", "представлениях", "передачах состояний", "единых интерфейсах", "гипермедиа" или любых других ограничениях или аспектах Стиль архитектуры REST, идентифицированный Fielding. Абстракции, предоставляемые различными структурами REST, поэтому путают и бесполезны.
Итак: вы хотите отправлять HTTP-запросы с использованием Java в 2015 году. Вы хотите, чтобы API был ясным, выразительным, интуитивным, идиоматичным, простым. Что использовать? Я больше не использую Java, но в течение последних нескольких лет клиентская библиотека Java HTTP, которая казалась наиболее перспективной и интересной, OkHttp. Проверьте это.
Вы можете определенно взаимодействовать с веб-службами RESTful, используя URLConnection
или HTTPClient для кодирования HTTP-запросов.
Однако, как правило, более желательно использовать библиотеку или фреймворк, который обеспечивает более простой и более семантический API, специально предназначенный для этой цели. Это делает код более легким для записи, чтения и отладки и уменьшает дублирование усилий. Эти структуры обычно реализуют некоторые замечательные функции, которые не обязательно присутствуют или просты в использовании в библиотеках более низкого уровня, таких как согласование контента, кэширование и аутентификация.
Некоторые из наиболее зрелых опций Jersey, RESTEasy и Restlet.
Я больше всего знаком с Restlet и Jersey, посмотрим, как мы будем делать запрос 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
, но, надеюсь, эти примеры полезны нетривиальны, но не слишком сложны.
Как вы можете видеть, у Restlet и Jersey есть аналогичные клиентские API. Я считаю, что они были разработаны примерно в одно и то же время и, следовательно, влияли друг на друга.
Я обнаружил, что API-интерфейс Restlet немного семантичен, и поэтому немного яснее, но YMMV.
Как я уже сказал, я больше всего знаком с Restlet, я много лет использовал его во многих приложениях, и я очень доволен этим. Это очень зрелая, надежная, простая, эффективная, активная и хорошо поддерживаемая структура. Я не могу говорить с Джерси или RESTEasy, но у меня сложилось впечатление, что оба они тоже твердые.
Ответ 3
Это очень сложно в java, поэтому я бы предложил использовать Spring RestTemplate
абстракция:
String result =
restTemplate.getForObject(
"http://example.com/hotels/{hotel}/bookings/{booking}",
String.class,"42", "21"
);
Справка:
- Spring Блог: Отдых в Spring 3 (RestTemplate)
- Spring Ссылка: Доступ к RESTful услуг на клиенте
- JavaDoc:
RestTemplate
Ответ 4
Если вам просто нужно сделать простой вызов службы REST из java, вы используете что-то в этой строке
/*
* Stolen from http://xml.nig.ac.jp/tutorial/rest/index.html
* and http://www.dr-chuck.com/csev-blog/2007/09/calling-rest-web-services-from-java/
*/
import java.io.*;
import java.net.*;
public class Rest {
public static void main(String[] args) throws IOException {
URL url = new URL(INSERT_HERE_YOUR_URL);
String query = INSERT_HERE_YOUR_URL_PARAMETERS;
//make connection
URLConnection urlc = url.openConnection();
//use post mode
urlc.setDoOutput(true);
urlc.setAllowUserInteraction(false);
//send query
PrintStream ps = new PrintStream(urlc.getOutputStream());
ps.print(query);
ps.close();
//get result
BufferedReader br = new BufferedReader(new InputStreamReader(urlc
.getInputStream()));
String l = null;
while ((l=br.readLine())!=null) {
System.out.println(l);
}
br.close();
}
}
Ответ 5
Существует несколько API RESTful. Я бы порекомендовал Джерси;
Документация API клиента находится здесь;
https://jersey.java.net/documentation/latest/index.html
Обновление
Местоположение для документов OAuth в комментарии ниже является мертвой ссылкой и переместилось на https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334
Ответ 6
Вы можете проверить CXF. Вы можете посетить статью JAX-RS здесь
Вызов так же просто, как это (цитата):
BookStore store = JAXRSClientFactory.create("http://bookstore.com", BookStore.class);
// (1) remote GET call to http://bookstore.com/bookstore
Books books = store.getAllBooks();
// (2) no remote call
BookResource subresource = store.getBookSubresource(1);
// {3} remote GET call to http://bookstore.com/bookstore/1
Book b = subresource.getDescription();
Ответ 7
Я хочу поделиться своим личным опытом, вызвав REST WS с вызовом Post JSON:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLConnection;
public class HWS {
public static void main(String[] args) throws IOException {
URL url = new URL("INSERT YOUR SERVER REQUEST");
//Insert your JSON query request
String query = "{'PARAM1': 'VALUE','PARAM2': 'VALUE','PARAM3': 'VALUE','PARAM4': 'VALUE'}";
//It change the apostrophe char to double colon char, to form a correct JSON string
query=query.replace("'", "\"");
try{
//make connection
URLConnection urlc = url.openConnection();
//It Content Type is so importan to support JSON call
urlc.setRequestProperty("Content-Type", "application/xml");
Msj("Conectando: " + url.toString());
//use post mode
urlc.setDoOutput(true);
urlc.setAllowUserInteraction(false);
//send query
PrintStream ps = new PrintStream(urlc.getOutputStream());
ps.print(query);
Msj("Consulta: " + query);
ps.close();
//get result
BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
String l = null;
while ((l=br.readLine())!=null) {
Msj(l);
}
br.close();
} catch (Exception e){
Msj("Error ocurrido");
Msj(e.toString());
}
}
private static void Msj(String texto){
System.out.println(texto);
}
}
Ответ 8
Самое простое решение будет использовать клиентскую библиотеку Apache http. см. следующий пример кода.. этот код использует базовую безопасность для аутентификации.
Добавьте следующую зависимость.
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency>
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
Credentials credentials = new UsernamePasswordCredentials("username", "password");
credentialsProvider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build();
HttpPost request = new HttpPost("https://api.plivo.com/v1/Account/MAYNJ3OT/Message/");HttpResponse response = client.execute(request);
// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
textView = textView + line;
}
System.out.println(textView);
Ответ 9
Действительно, это "очень сложно в Java":
От: https://jersey.java.net/documentation/latest/client.html
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://foo").path("bar");
Invocation.Builder invocationBuilder = target.request(MediaType.TEXT_PLAIN_TYPE);
Response response = invocationBuilder.get();
Ответ 10
Вы можете использовать Async Http Client (библиотека также поддерживает протокол WebSocket):
String clientChannel = UriBuilder.fromPath("http://localhost:8080/api/{id}").build(id).toString();
try (AsyncHttpClient asyncHttpClient = new AsyncHttpClient())
{
BoundRequestBuilder postRequest = asyncHttpClient.preparePost(clientChannel);
postRequest.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
postRequest.setBody(message.toString()); // returns JSON
postRequest.execute().get();
}