Panggilan tenang di Jawa

150

Saya akan membuat panggilan tenang di Jawa. Namun, saya tidak tahu bagaimana menelepon. Apakah saya perlu menggunakan koneksi URLC atau yang lainnya? Ada yang bisa bantu saya. Terima kasih.

Pertanyaan
sumber
Tergantung bagaimana Anda melakukan panggilan istirahat di aplikasi Anda. Apakah Anda menggunakan implementasi JaxRS? Yang khusus? Apakah Anda melakukan permintaan secara manual?
Colin Hebert
@Colin Hebert, terima kasih atas balasan Anda. Tapi saya tidak punya ide tentang panggilan tenang. dapatkah Anda memberi saya informasi lebih lanjut tentang berbagai bagian dari panggilan ISTIRAHAT.
Pertanyaan
checkout http klien yang tenang klik di sini
Gaurav J

Jawaban:

91

Jika Anda menelepon layanan tenang dari Service Provider (misalnya Facebook, Twitter), Anda dapat melakukannya dengan rasa pilihan Anda:

Jika Anda tidak ingin menggunakan pustaka eksternal, Anda dapat menggunakan java.net.HttpURLConnectionatau javax.net.ssl.HttpsURLConnection(untuk SSL), tetapi itu adalah panggilan yang dienkapsulasi dalam pola tipe Pabrik di java.net.URLConnection. Untuk menerima hasilnya, Anda harus connection.getInputStream()mengembalikan InputStream. Anda kemudian harus mengubah aliran input Anda ke string dan mengurai string ke objek yang representatif (misalnya XML, JSON, dll).

Atau, Apache HttpClient (versi 4 adalah yang terbaru). Ini lebih stabil dan kuat daripada standar java URLConnectiondan mendukung sebagian besar (jika tidak semua) protokol HTTP (dan juga dapat diatur ke mode Ketat). Respons Anda akan tetap ada InputStreamdan Anda dapat menggunakannya seperti yang disebutkan di atas.


Dokumentasi di HttpClient: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html

Buhake Sindi
sumber
5
Jangan menemukan kembali roda, gunakan salah satu implementasi RESTful yang ada.
Qwerky
13
Itu tidak menciptakan kembali roda, saya katakan Anda dapat menggunakan apa pun yang flavourAnda inginkan. Beberapa menginginkan default URLConnection, beberapa menginginkan HttpClient. Bagaimanapun, itu ada di sana untuk Anda gunakan.
Buhake Sindi
@The Elite Gentleman, terima kasih atas balasan Anda. Setelah memeriksa semua perpustakaan, saya ingin menggunakan Apache HttpClient, maukah Anda memberi saya lebih banyak referensi tentang yang ini?
Pertanyaan
@Pertanyaan, tautan ke contoh HttpClient 4 tampaknya rusak, jadi jika Anda memiliki pertanyaan (maksudnya ... lol), beri tahu saya .... Saya menanganinya hampir setiap hari.
Buhake Sindi
Tolong tunjukkan kode contoh tentang bagaimana menggunakan kelas-kelas ini, daripada hanya mencatat keberadaan mereka
Jonathan
150

Pembaruan: Sudah hampir 5 tahun sejak saya menulis jawaban di bawah ini; hari ini saya memiliki perspektif yang berbeda.

99% dari waktu ketika orang menggunakan istilah REST, mereka benar-benar berarti HTTP; mereka tidak terlalu peduli tentang “sumber daya”, “representasi”, “transfer negara”, “antarmuka seragam”, “hypermedia”, atau kendala atau aspek lain dari gaya arsitektur REST yang diidentifikasi oleh Fielding . Abstraksi yang disediakan oleh berbagai kerangka kerja REST karenanya membingungkan dan tidak membantu.

Jadi: Anda ingin mengirim permintaan HTTP menggunakan Java pada tahun 2015. Anda menginginkan API yang jelas, ekspresif, intuitif, idiomatik, sederhana. Apa yang harus digunakan? Saya tidak lagi menggunakan Java, tetapi selama beberapa tahun terakhir perpustakaan klien HTTP Java yang tampaknya paling menjanjikan dan menarik adalah OkHttp . Saksikan berikut ini.


Anda pasti dapat berinteraksi dengan layanan web RESTful dengan menggunakan URLConnectionatau HTTPClient untuk mengkode permintaan HTTP.

Namun, umumnya lebih diinginkan untuk menggunakan pustaka atau kerangka kerja yang menyediakan API semantik dan lebih sederhana yang dirancang khusus untuk tujuan ini. Ini membuat kode lebih mudah untuk ditulis, dibaca, dan didebug, dan mengurangi duplikasi usaha. Kerangka kerja ini umumnya menerapkan beberapa fitur hebat yang tidak selalu ada atau mudah digunakan di perpustakaan tingkat rendah, seperti negosiasi konten, caching, dan otentikasi.

Beberapa opsi yang paling matang adalah Jersey , RESTEasy , dan Restlet .

Saya paling akrab dengan Restlet, dan Jersey, mari kita lihat bagaimana kami akan membuat POSTpermintaan dengan kedua API.

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

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

Tentu saja, permintaan GET bahkan lebih sederhana, dan Anda juga dapat menentukan hal-hal seperti tag dan Acceptheader entitas , tetapi semoga contoh-contoh ini bermanfaat non-sepele tetapi tidak terlalu rumit.

Seperti yang Anda lihat, Restlet dan Jersey memiliki API klien yang serupa. Saya percaya mereka dikembangkan sekitar waktu yang sama, dan karena itu saling mempengaruhi.

Saya menemukan API Restlet menjadi sedikit lebih semantik, dan karena itu sedikit lebih jelas, tetapi YMMV.

Seperti yang saya katakan, saya paling akrab dengan Restlet, saya telah menggunakannya di banyak aplikasi selama bertahun-tahun, dan saya sangat senang dengannya. Ini adalah kerangka kerja yang sangat matang, kuat, sederhana, efektif, aktif, dan didukung dengan baik. Saya tidak dapat berbicara dengan Jersey atau RESTEasy, tetapi kesan saya adalah mereka berdua juga pilihan yang solid.

Avi Flax
sumber
2
Tapi masih posting yang bagus. Dan saya harus setuju dengan "99% dari waktu ketika orang menggunakan istilah REST, mereka benar-benar berarti HTTP; ... Abstraksi yang disediakan oleh berbagai kerangka kerja REST karenanya membingungkan dan tidak membantu."
AlexD
2
Dalam contoh Jersey Anda, di mana / bagaimana objek Formulir bisa digunakan? Itu dibuat, tetapi tampaknya tidak menambahkan apa pun pada contoh.
splungebob
24

Jika Anda hanya perlu melakukan panggilan sederhana ke layanan REST dari java Anda menggunakan sesuatu di sepanjang baris ini

/*
 * 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();
    }
}
naik opelet
sumber
1
Ada beberapa API SISA yang sangat bagus di sekitar, saya sarankan menggunakan satu daripada menciptakan kembali roda.
Qwerky
seperti yang saya katakan: rumit sekali. (tidak, saya tidak membatalkan ini, ini solusi yang sangat valid)
Sean Patrick Floyd
4
@Qwerky Pustaka API sisi Klien biasanya merupakan pelanggaran batasan REST. Mereka memperkenalkan kopling terlalu banyak. Menggunakan perpustakaan HTTP yang baik adalah opsi yang jauh lebih baik dalam jangka panjang.
Darrel Miller
10

Ada beberapa API yang tenang. Saya akan merekomendasikan Jersey;

https://jersey.java.net/

Dokumentasi API Klien ada di sini;

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

Perbarui
Lokasi untuk dokumen OAuth dalam komentar di bawah adalah tautan mati dan telah pindah ke https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334

Qwerky
sumber
6
OP tidak membuat aplikasi RESTful, dia membuat panggilan RESTful, yaitu seperti memanggil sumber daya metode API Twitter.
Buhake Sindi
@Qwerky - Saya pikir akan membantu untuk memasukkan mengapa Anda merekomendasikan Jersey dalam jawaban Anda.
Danny Bullis
7

Saya ingin berbagi pengalaman pribadi saya, menelepon REST WS dengan panggilan 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);
    }
}
Lisandro
sumber
5

Anda dapat melihat CXF . Anda dapat mengunjungi Artikel JAX-RS di sini

Memanggil sesederhana ini (kutipan):

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();
Joopiter
sumber
5

Memang, ini "sangat rumit di Jawa":

Dari: 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();
JRun
sumber
4

Solusi Paling Mudah akan menggunakan perpustakaan klien Apache http. lihat kode sampel berikut .. kode ini menggunakan keamanan dasar untuk otentikasi.

Tambahkan Ketergantungan berikut.

<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);
Hemin
sumber
1

Saya melihat banyak jawaban, inilah yang kami gunakan pada 2020 WebClient , dan BTW RestTemplate akan mulai ditinggalkan. (dapat memeriksa ini) RestTemplate akan ditinggalkan

Francis Raj
sumber
Alih-alih memberikan tautan, bisakah Anda menambahkan penjelasan di sini?
Kishan Bharda
-1

Anda dapat menggunakan Async Http Client (Perpustakaan juga mendukung Protokol WebSocket ) seperti itu:

    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();
    }
kayz1
sumber
itu tidak berfungsi (tidak bisa memunculkan ASyncHttpClient).
Java Main