Java ile RESTful çağrı


150

Java ile RESTful arama yapacağım. Ancak, nasıl çağrı yapacağımı bilmiyorum. URLConnection veya diğerlerini kullanmam gerekir mi? Biri bana yardım edebilir mi. teşekkür ederim.


Bu, uygulamanızda geri kalan çağrıları nasıl yaptığınıza bağlıdır. JaxRS uygulaması kullanıyor musunuz? Belirli bir tane mi? Manuel olarak istekte bulunuyor musunuz?
Colin Hebert

@Colin Hebert, cevabınız için teşekkür ederim. Ama RESTful çağrısı hakkında hiçbir fikrim yok. RESTful çağrısının farklı bölümleri hakkında daha fazla bilgi verebilir misiniz?
Sorular

ödeme http dinlendirici müşteri buraya tıklayın
Gaurav J

Yanıtlar:


91

Bir Servis Sağlayıcıdan (örneğin Facebook, Twitter) bir RESTful servisi arıyorsanız, istediğiniz herhangi bir lezzetle yapabilirsiniz:

Harici kütüphaneler kullanmak istemiyorsanız, java.net.HttpURLConnectionveya javax.net.ssl.HttpsURLConnection(SSL için) kullanabilirsiniz, ancak bu, içinde bir Fabrika türü modelinde kapsüllenmiş çağrıdır java.net.URLConnection. Sonucu almak için size connection.getInputStream()hangisini döndürür InputStream. Daha sonra giriş akışınızı dizeye dönüştürmeniz ve dizeyi temsili nesnesine (ör. XML, JSON, vb.) Ayrıştırmanız gerekir.

Alternatif olarak, Apache HttpClient (sürüm 4 en son sürümdür). Java'nın varsayılanından daha kararlı ve sağlamdır URLConnectionve çoğu (hepsi değilse de) HTTP protokolünü destekler (ayrıca Sıkı moda ayarlanabilir). Yanıtınız hala burada olacak InputStreamve yukarıda belirtildiği gibi kullanabilirsiniz.


HttpClient ile ilgili belgeler: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html


5
Tekerleği yeniden icat etmeyin, mevcut RESTful uygulamalarından birini kullanın.
Qwerky

13
Tekerleği yeniden icat etmiyor, diyorum ki ne flavouristersen kullanabilirsin . Bazıları varsayılanı URLConnection, bazıları ister HttpClient. Her iki durumda da, kullanmanız için orada.
Buhake Sindi

Elite Elite, cevabınız için teşekkür ederim. Tüm kütüphaneyi kontrol ettikten sonra Apache HttpClient'i kullanmak istiyorum, bana bu konuda daha fazla referans vermek ister misiniz?
Sorular

@Sorular, HttpClient 4 örneklerine bağlantı kopmuş gibi görünüyor, bu yüzden herhangi bir sorunuz varsa (pun amaçlı ... lol), bana bildirin .... Neredeyse her gün bununla başa çıkıyorum.
Buhake Sindi

Sadece kendi varlığını belirterek ziyade, bu sınıflar nasıl kullanılacağına ilişkin bir örnek kod göstermek Lütfen
Jonathan

150

Güncelleme: Aşağıdaki cevabı yazdığımdan bu yana neredeyse 5 yıl geçti; bugün farklı bir bakış açım var.

İnsanların REST terimini kullandıkları zamanın% 99'u gerçekten HTTP anlamına gelir; “kaynaklar”, “temsiller”, “devlet transferleri”, “tekdüze arayüzler”, “hipermedya” ya da Fielding tarafından tanımlanan REST mimari stilinin diğer kısıtlamaları veya yönleri hakkında daha az önem verebilirlerdi . Bu nedenle, çeşitli REST çerçeveleri tarafından sağlanan soyutlamalar kafa karıştırıcı ve yararsızdır.

Yani: 2015 yılında Java kullanarak HTTP istekleri göndermek istiyorsunuz. Açık, etkileyici, sezgisel, deyimsel, basit bir API istiyorsunuz. Ne kullanılır? Artık Java kullanmıyorum, ancak son birkaç yıldır en umut verici ve ilginç görünen Java HTTP istemci kütüphanesi OkHttp . Bunu kontrol et.


HTTP isteklerini kodlamak için RESTful web hizmetleriyle URLConnectionveya HTTPClient kullanarak kesinlikle etkileşimde bulunabilirsiniz .

Bununla birlikte, bu amaç için özel olarak tasarlanmış daha basit ve daha anlamsal bir API sağlayan bir kütüphane veya çerçeve kullanılması genellikle daha arzu edilir. Bu, kodun yazılmasını, okunmasını ve hata ayıklanmasını kolaylaştırır ve eforun tekrarlanmasını azaltır. Bu çerçeveler genellikle içerik anlaşması, önbelleğe alma ve kimlik doğrulama gibi alt düzey kitaplıklarda bulunması veya kullanılması kolay olmayan bazı harika özellikler uygular.

En olgun seçeneklerden bazıları Jersey , RESTEasy ve Restlet'dir .

Restlet ve Jersey hakkında en fazla bilgi sahibi olduğumdan, POSTher iki API ile nasıl istekte bulunacağımıza bakalım .

Jersey Örneği

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 Örneği

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

Elbette, GET istekleri daha da basittir ve ayrıca varlık etiketleri ve Acceptbaşlıkları gibi şeyleri de belirtebilirsiniz , ancak umarım bu örnekler yararlı değildir, ancak çok karmaşık değildir.

Gördüğünüz gibi Restlet ve Jersey benzer istemci API'larına sahip. Aynı zamanda geliştiklerine ve dolayısıyla birbirlerini etkilediğine inanıyorum.

Restlet API'sini biraz daha semantik ve dolayısıyla biraz daha net, ama YMMV olarak buluyorum.

Dediğim gibi, Restlet'i en iyi biliyorum, yıllarca birçok uygulamada kullandım ve bundan çok memnunum. Çok olgun, sağlam, basit, etkili, aktif ve iyi desteklenen bir çerçevedir. Jersey veya RESTEasy ile konuşamam, ama benim izlenimim ikisi de sağlam seçimler.


2
Ama yine de harika bir gönderi. Ve kabul etmeliyim ki, "insanların REST terimini kullandıkları zamanların% 99'u gerçekten HTTP anlamına geliyor; ... Çeşitli REST çerçeveleri tarafından sağlanan soyutlamalar bu nedenle kafa karıştırıcı ve yararsızdır."
AlexD

2
Jersey örneğinizde, Form nesnesi nerede / nasıl kullanılır? Oluşturuldu, ancak örneğe hiçbir şey eklenmedi.
splungebob


24

Java'dan bir REST servisine basit bir çağrı yapmanız gerekiyorsa, bu hat boyunca bir şey kullanırsınız

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

1
Bazı gerçekten iyi REST API'leri var, tekerleği yeniden icat etmek yerine bir tane kullanmanızı tavsiye ederim.
Qwerky

dediğim gibi: cehennem gibi karmaşık. (hayır, bunu indirmedim, mükemmel geçerli bir çözüm)
Sean Patrick Floyd

4
@Qwerky İstemci tarafı API kitaplıkları genellikle REST kısıtlamalarının ihlalidir. Çok fazla bağlantı kurarlar. İyi bir HTTP kütüphanesi kullanmak uzun vadede çok daha iyi bir seçenektir.
Darrel Miller

10

Çevresinde birkaç RESTful API var. Jersey tavsiye ederim;

https://jersey.java.net/

İstemci API dokümanları burada;

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


Aşağıdaki yorumdaki OAuth dokümanlarının Konumunu Güncelle ölü bir bağlantıdır ve https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334 adresine taşındı


6
OP bir RESTful uygulaması oluşturmuyor, RESTful çağrıları yapıyor, örneğin bir Twitter API yöntemi kaynağı çağırmak gibi.
Buhake Sindi

@Qwerky - Sanırım cevabınıza Jersey'yi neden önerdiğinizi eklemeniz yararlı olacaktır.
Danny Bullis

7

Post JSON çağrısı ile bir REST WS'yi çağırarak kişisel deneyimimi paylaşmak istiyorum:

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

5

CXF'yi kontrol edebilirsiniz . JAX-RS Makalesini buradan ziyaret edebilirsiniz

Aramak bu kadar basit (alıntı):

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

Aslında, bu "Java'da çok karmaşıktır":

Gönderen: 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

En Kolay Çözüm Apache http istemci kitaplığını kullanacaktır. aşağıdaki örnek kodu inceleyin .. bu kod kimlik doğrulaması için temel güvenliği kullanır.

Aşağıdaki Bağımlılığı ekleyin.

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


-1

Sen kullanabilirsiniz uyumsuz HTTP Client (kütüphane de destekler WebSocket Protokolü) gibi:

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

çalışmıyor (ASyncHttpClient örneğini oluşturamıyor).
Java Main
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.