Apel RESTful în Java (Programare, Java, Rest)

Întrebări a intrebat.

Am de gând să fac un apel RESTful în Java. Cu toate acestea, nu știu cum să fac apelul. Trebuie să folosesc URLConnection sau altele? Mă poate ajuta cineva. vă mulțumesc.

Comentarii

  • Depinde de modul în care efectuați apelurile rest în aplicația dvs. Folosiți o implementare JaxRS ? Una anume ? Faceți solicitările manual ? –  > Por Colin Hebert.
  • @Colin Hebert, vă mulțumim pentru răspuns. Dar nu am nici o idee despre apelul RESTful. îmi puteți oferi mai multe informații despre diferitele părți ale apelului RESTful. –  > Por Întrebări.
  • checkout http restful client faceți clic aici –  > Por Gaurav J.
11 răspunsuri
Buhake Sindi

Dacă apelați un serviciu RESTful de la un furnizor de servicii (de exemplu, Facebook, Twitter), puteți face acest lucru cu orice aromă la alegere:

Dacă nu doriți să utilizați biblioteci externe, puteți utiliza java.net.HttpURLConnection sau javax.net.ssl.HttpsURLConnection (pentru SSL), dar acest apel este încapsulat într-un model de tip Factory în java.net.URLConnection.Pentru a primi rezultatul, va trebui să connection.getInputStream() care vă returnează un InputStream. Apoi va trebui să convertiți fluxul de intrare în șir de caractere și să analizați șirul în obiectul său reprezentativ (de exemplu, XML, JSON etc.).

Alternativ, Apache HttpClient (versiunea 4 este cea mai recentă). Este mai stabil și mai robust decât aplicația implicită din java URLConnection și suportă majoritatea (dacă nu toate) protocoalelor HTTP (precum și faptul că poate fi setat în modul Strict). Răspunsul dvs. va fi în continuare în format InputStream și îl puteți utiliza așa cum s-a menționat mai sus.


Documentație privind HttpClient: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html

Comentarii

  • Nu reinventați roata, folosiți una dintre implementările RESTful existente. –  > Por Qwerky.
  • Nu este vorba de reinventarea roții, eu spun că puteți folosi orice flavour doriți. Unii vor să se folosească de opțiunea implicită URLConnection, , alții vor HttpClient. În orice caz, este acolo pentru a o folosi. –  > Por Buhake Sindi.
  • @The Elite Gentleman, vă mulțumesc pentru răspuns. După ce am verificat toate bibliotecile, vreau să folosesc Apache HttpClient, ați putea să-mi dați mai multe referințe despre acesta? –  > Por Întrebări.
  • @Questions, linkul către exemplele HttpClient 4 pare să fie stricat, așa că, dacă aveți întrebări (joc de cuvinte…lol), anunțați-mă….Am de-a face cu el aproape zilnic. –  > Por Buhake Sindi.
  • Vă rugăm să arătați exemple de cod de utilizare a acestor clase, în loc să vă limitați la a menționa existența lor –  > Por Jonathan.
Avi Flax

Actualizare: Au trecut aproape 5 ani de când am scris răspunsul de mai jos; astăzi am o perspectivă diferită.

În 99% din cazuri, când oamenii folosesc termenul REST, se referă de fapt la HTTP; nu le pasă deloc de „resurse”, „reprezentări”, „transferuri de stare”, „interfețe uniforme”, „hipermedia” sau orice altă constrângeri sau aspecte ale stilului de arhitectură REST identificat de Fielding. Prin urmare, abstractizările oferite de diversele cadre REST sunt confuze și nefolositoare.

Așadar: doriți să trimiteți cereri HTTP folosind Java în 2015. Doriți un API care să fie clar, expresiv, intuitiv, idiomatic, simplu. Ce să folosiți? Nu mai folosesc Java, dar în ultimii ani biblioteca Java HTTP client care mi s-a părut cea mai promițătoare și interesantă este OkHttp. Aruncați o privire.


Puteți interacționa cu siguranță cu serviciile web RESTful folosind URLConnection sau HTTPClient pentru a codifica cererile HTTP.

Cu toate acestea, în general, este mai de dorit să folosiți o bibliotecă sau un cadru care oferă un API mai simplu și mai semantic, conceput special în acest scop. Astfel, codul este mai ușor de scris, citit și de depanat și se reduce duplicarea eforturilor. Aceste cadre implementează, în general, unele caracteristici excelente care nu sunt neapărat prezente sau ușor de utilizat în bibliotecile de nivel inferior, cum ar fi negocierea conținutului, memoria cache și autentificarea.

Unele dintre cele mai mature opțiuni sunt Jersey, , RESTEasy, , și Restlet.

Eu sunt cel mai familiarizat cu Restlet, iar Jersey, să vedem cum am face un POST cerere cu ambele API-uri.

Exemplu Jersey

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());
}

Exemplu Restlet

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());
}

Bineînțeles, cererile GET sunt și mai simple și puteți specifica, de asemenea, lucruri precum etichete de entitate și Accept anteturi, dar sperăm că aceste exemple sunt utile și nu sunt triviale, dar nici prea complexe.

După cum puteți vedea, Restlet și Jersey au API-uri client similare. Cred că au fost dezvoltate cam în aceeași perioadă și, prin urmare, s-au influențat reciproc.

Eu consider că API-ul Restlet este puțin mai semantic și, prin urmare, puțin mai clar, dar YMMV.

După cum am spus, eu sunt cel mai familiarizat cu Restlet, l-am folosit în multe aplicații de ani de zile și sunt foarte mulțumit de el. Este un cadru foarte matur, robust, simplu, eficient, activ și bine susținut. Nu pot vorbi despre Jersey sau RESTEasy, dar impresia mea este că ambele sunt, de asemenea, alegeri solide.

Comentarii

  • Dar, totuși, o postare excelentă. Și trebuie să fiu de acord cu „În 99% din cazuri, atunci când oamenii folosesc termenul REST, se referă de fapt la HTTP; …Abstracțiunile oferite de diferite cadre REST sunt, prin urmare, confuze și nefolositoare.” –  > Por AlexD.
  • În exemplul dvs. din Jersey, unde/cum se utilizează obiectul Form? Este creat, dar nu pare să adauge nimic la exemplu. –  > Por splungebob.
Sean Patrick Floyd

Acest lucru este foarte complicat în java, motiv pentru care vă sugerez să folosiți Spring’s RestTemplate abstractizare:

String result = 
restTemplate.getForObject(
    "http://example.com/hotels/{hotel}/bookings/{booking}",
    String.class,"42", "21"
);

Referință:

jitter

Dacă trebuie doar să efectuați un apel simplu la un serviciu REST din java, utilizați ceva de genul următor

/*
 * 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();
    }
}

Comentarii

  • Există câteva API-uri REST foarte bune, v-aș recomanda să folosiți una mai degrabă decât să reinventați roata. –  > Por Qwerky.
  • așa cum am spus: complicat ca naiba. (nu, nu am votat asta în jos, este o soluție perfect valabilă) – –  > Por Sean Patrick Floyd.
  • @Qwerky Bibliotecile de API-uri de partea clientului sunt, de obicei, o încălcare a constrângerilor REST. Ele introduc mult prea mult cuplaj. Folosirea unei biblioteci HTTP bune este o opțiune mult mai bună pe termen lung. –  > Por Darrel Miller.
Qwerky

Există mai multe API-uri RESTful. Eu aș recomanda Jersey;

https://jersey.java.net/

Documentația API-ului client este aici;

https://jersey.java.net/documentation/latest/index.html

Actualizare
Locația pentru documentația OAuth din comentariul de mai jos este un link mort și s-a mutat la https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334

Comentarii

  • OP nu creează o aplicație RESTful, ci face apeluri RESTful, adică, ca și cum ar apela o resursă de metodă API Twitter. –  > Por Buhake Sindi.
  • @Qwerky – Cred că ar fi util să incluzi în răspunsul tău de ce recomanzi Jersey. –  > Por Danny Bullis.
Lisandro

Vreau să împărtășesc experiența mea personală, apelând un REST WS cu apel 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 quote char, to form a correct JSON string
        query=query.replace("'", """);

        try{
            //make connection
            URLConnection urlc = url.openConnection();
            //It Content Type is so important 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);
    }
}

Joopiter

Puteți să verificați CXF. Puteți vizita articolul JAX-RS aici

Apelarea este la fel de simplă ca aceasta (citat):

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();

JRun

Într-adevăr, acest lucru este „foarte complicat în Java”:

De la: 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();

Hemin

Soluția cea mai simplă va fi utilizarea bibliotecii Apache http client. consultați următorul cod de exemplu..acest cod utilizează securitatea de bază pentru autentificare.

Adăugați următoarea dependență.

<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);

Comentarii

  • ați furnizat dependențele maven, dar nu ați inclus nicio declarație de import. Aceasta a fost aproape util. –  > Por barrypicker.
Francis Raj

Văd multe răspunsuri, iată ce folosim în 2020 WebClient, , și BTW RestTemplate va fi depreciat. (puteți verifica acest lucru) RestTemplate va fi depreciat

Comentarii

  • În loc să oferiți un link, puteți adăuga aici o explicație? –  > Por Kishan Bharda.
kayz1

Puteți utiliza Async Http Client (Biblioteca suportă, de asemenea, și WebSocket Protocol) în acest fel:

    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();
    }

Comentarii

  • nu funcționează ( nu se poate instanția ASyncHttpClient ) . –  > Por Java principal.

Tags:,