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ę.

 115
Author: Questions, 2010-10-12

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

 73
Author: Buhake Sindi,
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.

 132
Author: Avi Flax,
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:

 25
Author: Sean Patrick Floyd,
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();
    }
}
 20
Author: jitter,
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;

Https://jersey.java.net/

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

 10
Author: Qwerky,
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);
    }
}
 7
Author: Lisandro,
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();
 5
Author: Joopiter,
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();
 4
Author: JRun,
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);
 4
Author: Hemin,
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();
    }
 0
Author: kayz1,
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