RESTful call w Javie
Wykonam spokojne połączenie w Javie. Jednak nie wiem, jak zadzwonić. Czy muszę używać URLConnection lub innych? Czy ktoś może mi pomóc? dziękuję.
10 answers
Jeśli dzwonisz do serwisu RESTful od Usługodawcy (np. Facebook, Twitter), możesz to zrobić z dowolnym smakiem według własnego wyboru:
Jeśli nie chcesz używać zewnętrznych bibliotek, możesz użyć java.net.HttpURLConnection
LUB javax.net.ssl.HttpsURLConnection
(dla SSL), ale jest to wywołanie zamknięte w fabrycznym wzorze typu w java.net.URLConnection
.
Aby otrzymać wynik, musisz connection.getInputStream()
, który zwraca ci InputStream
. Następnie będziesz musiał przekonwertować strumień wejściowy na łańcuch znaków i przetworzyć łańcuch do reprezentującego Go obiektu (np. XML, JSON, itp.).
Alternatywnie, Apache HttpClient (wersja 4 jest najnowsza). Jest bardziej stabilny i solidny niż domyślna java URLConnection
i obsługuje większość (jeśli nie wszystkie) protokołów HTTP (jak również może być ustawiony na tryb ścisły). Twoja odpowiedź nadal będzie w InputStream
i możesz jej użyć, jak wspomniano powyżej.
Dokumentacja na HttpClient: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-11 21:34:16
Update: minęło prawie 5 lat odkąd napisałem odpowiedź poniżej; dziś mam inną perspektywę.
W 99% przypadków, kiedy ludzie używają terminu REST, tak naprawdę mają na myśli HTTP; mogą mniej dbać o "zasoby", "reprezentacje", "transfery państwowe", "jednolite interfejsy", "hypermedia" lub jakiekolwiek inne ograniczenia lub aspekty stylu architektury REST zidentyfikowane przez Fieldinga {11]}. Abstrakcje dostarczane przez różne frameworki REST są więc mylące i nieprzydatny.Więc: chcesz wysyłać żądania HTTP za pomocą Javy w 2015 roku. Chcesz API, które jest jasne, ekspresyjne, intuicyjne, idiomatyczne, proste. Czego użyć? Nie używam już Javy, ale od kilku lat najbardziej obiecującą i interesującą biblioteką Java HTTP jest OkHttp. Zobacz też
Możesz zdecydowanie wchodzić w interakcje z usługami sieciowymi RESTful, używając URLConnection
lub HTTPClient do kodowania żądań HTTP.
Jednak to ogólnie bardziej pożądane jest użycie biblioteki lub frameworka, który zapewnia prostsze i bardziej semantyczne API specjalnie zaprojektowane do tego celu. Ułatwia to pisanie, odczytywanie i debugowanie kodu oraz zmniejsza powielanie wysiłku. Te struktury zazwyczaj implementują kilka świetnych funkcji, które niekoniecznie są obecne lub łatwe w użyciu w bibliotekach niższego poziomu, takich jak negocjowanie zawartości, buforowanie i uwierzytelnianie.
Niektóre z najbardziej dojrzałych opcji to Jersey , RESTEasy i Restlet .
Jestem najbardziej zaznajomiony z Restlet, i Jersey, spójrzmy, jak moglibyśmy złożyć POST
wniosek z obu API.
Przykład Koszulki
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());
}
Restlet Przykład
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());
}
Oczywiście, żądania GET są jeszcze prostsze i można również określać rzeczy takie jak znaczniki encji i nagłówki Accept
, ale miejmy nadzieję, że te przykłady są użytecznie nietrywialne, ale nie zbyt skomplikowane.
Jak widać, Restlet i Jersey mają podobnego klienta APIs. Uważam, że zostały one opracowane mniej więcej w tym samym czasie, a zatem wpłynęły na siebie nawzajem.
Uważam, że API Restlet jest trochę bardziej semantyczne, a zatem trochę jaśniejsze, ale YMMV.
Jak już mówiłem, najbardziej znam Restleta, używam go w wielu aplikacjach od lat i jestem z niego bardzo zadowolony. Jest to bardzo dojrzały, solidny, prosty, skuteczny, aktywny i dobrze wspierany framework. Nie mogę rozmawiać z Jersey ani RESTEasy, ale mam wrażenie, że oba są również solidne wybory.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 13:51:54
Jest to bardzo skomplikowane w Javie, dlatego sugerowałbym użycie Springa RestTemplate
abstrakcja:
String result =
restTemplate.getForObject(
"http://example.com/hotels/{hotel}/bookings/{booking}",
String.class,"42", "21"
);
Numer referencyjny:
- wiosenny Blog: odpoczynek wiosną 3 (RestTemplate)
- Referencja Wiosenna: Dostęp Do RESTful usługi u Klienta
- JavaDoc:
RestTemplate
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 10:15:53
Jeśli potrzebujesz wykonać proste wywołanie do usługi REST z Javy, używaj czegoś wzdłuż tej linii
/*
* 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();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 10:16:51
Istnieje kilka RESTful API wokół. Polecam Jersey;
Dokumentacja API klienta jest tutaj;
Https://jersey.java.net/documentation/latest/index.html
Update
Lokalizacja OAuth docs w komentarzu poniżej jest martwym linkiem i została przeniesiona do https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 09:44:15
Chcę podzielić się moim osobistym doświadczeniem, wywołując REST WS z wywołaniem 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);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-06 15:55:39
Możesz sprawdzić CXF . Możesz odwiedzić artykuł JAX-RS tutaj
Wywołanie jest tak proste jak to (cytat):
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();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 10:39:23
W rzeczywistości jest to "bardzo skomplikowane w Javie":
From: 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();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-24 14:06:01
Najprostszym rozwiązaniem będzie użycie biblioteki klienta http Apache. zapoznaj się z poniższym przykładowym kodem.. ten kod wykorzystuje podstawowe zabezpieczenia do uwierzytelniania.
Dodaj następującą zależność.
<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);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-10 06:28:53
Możesz użyć asynchronicznego klienta Http (biblioteka obsługuje również protokół WebSocket) w następujący sposób:
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();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-22 12:38:30