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.
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.
Jawaban:
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
flavourAnda inginkan. Beberapa menginginkan default URLConnection, beberapa menginginkan HttpClient. Bagaimanapun, itu ada di sana untuk Anda gunakan.
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.
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());
}
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.
Ini sangat rumit di java, itulah sebabnya saya menyarankan menggunakan RestTemplateabstraksi Spring :
String result =
restTemplate.getForObject(
"http://example.com/hotels/{hotel}/bookings/{booking}",
String.class,"42", "21"
);
Referensi:
RestTemplateJika 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();
}
}
Ada beberapa API yang tenang. Saya akan merekomendasikan Jersey;
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
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);
}
}
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();
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();
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);
Saya melihat banyak jawaban, inilah yang kami gunakan pada 2020 WebClient , dan BTW RestTemplate akan mulai ditinggalkan. (dapat memeriksa ini) RestTemplate akan ditinggalkan
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();
}