मैं जावा में एक RESTful कॉल करने जा रहा हूं। हालाँकि, मुझे नहीं पता कि कॉल कैसे करें। क्या मुझे URLConnection या अन्य का उपयोग करने की आवश्यकता है? क्या कोई मेरी मदद कर सकता है। धन्यवाद।
मैं जावा में एक RESTful कॉल करने जा रहा हूं। हालाँकि, मुझे नहीं पता कि कॉल कैसे करें। क्या मुझे URLConnection या अन्य का उपयोग करने की आवश्यकता है? क्या कोई मेरी मदद कर सकता है। धन्यवाद।
जवाबों:
यदि आप किसी सेवा प्रदाता (जैसे कि फेसबुक, ट्विटर) से Restful सेवा कॉल कर रहे हैं, तो आप इसे अपनी पसंद के किसी भी स्वाद के साथ कर सकते हैं :
आप बाहरी पुस्तकालयों का उपयोग नहीं करना चाहते हैं, तो आप उपयोग कर सकते हैं java.net.HttpURLConnection
या javax.net.ssl.HttpsURLConnection
(एसएसएल के लिए), लेकिन यह एक फैक्टरी प्रकार पैटर्न में समझाया कॉल है java.net.URLConnection
। परिणाम प्राप्त करने के लिए, connection.getInputStream()
आपको एक रिटर्न भरना होगा InputStream
। फिर आपको अपने इनपुट स्ट्रीम को स्ट्रिंग में बदलना होगा और स्ट्रिंग को प्रतिनिधि ऑब्जेक्ट (जैसे XML, JSON, आदि) में बदलना होगा।
वैकल्पिक रूप से, Apache HttpClient (संस्करण 4 नवीनतम है)। यह जावा के डिफॉल्ट की तुलना में अधिक स्थिर और मजबूत है URLConnection
और यह सबसे अधिक (यदि सभी नहीं) HTTP प्रोटोकॉल का समर्थन करता है (साथ ही इसे स्ट्रिक्ट मोड में सेट किया जा सकता है)। आपकी प्रतिक्रिया अभी भी रहेगी InputStream
और आप इसे ऊपर बताए अनुसार उपयोग कर सकते हैं।
HttpClient पर प्रलेखन: http://hc.apache.org/httpcompenders-client-ga/tutorial/html/index.html
flavour
चाहें उपयोग कर सकते हैं। कुछ डिफ़ॉल्ट चाहते हैं URLConnection
, कुछ चाहते हैं HttpClient
। किसी भी तरह से, यह आप का उपयोग करने के लिए है।
अद्यतन: जब से मैंने नीचे उत्तर लिखा है लगभग 5 साल हो गए हैं; आज मेरा एक अलग दृष्टिकोण है।
99% समय जब लोग REST शब्द का उपयोग करते हैं, तो उनका वास्तव में HTTP होता है; वे "संसाधन", "अभ्यावेदन", "राज्य स्थानान्तरण", "एकसमान इंटरफेस", "हाइपरमीडिया", या फील्डिंग द्वारा पहचाने गए REST वास्तुकला शैली के किसी भी अन्य बाधाओं या पहलुओं के बारे में कम परवाह कर सकते हैं । विभिन्न REST फ्रेमवर्क द्वारा प्रदान किए गए सार इसलिए भ्रामक और अनपेक्षित हैं।
तो: आप 2015 में जावा का उपयोग करके HTTP अनुरोध भेजना चाहते हैं। आप ऐसा एपीआई चाहते हैं जो स्पष्ट, अभिव्यंजक, सहज, मुहावरेदार, सरल हो। क्या उपयोग करें? मैं अब जावा का उपयोग नहीं करता, लेकिन पिछले कुछ वर्षों से जावा HTTP क्लाइंट लाइब्रेरी जो सबसे आशाजनक और दिलचस्प लग रहा है वह है OkHttp । इसकी जांच - पड़ताल करें।
HTTP अनुरोधों को कोड करने के लिए URLConnection
या HTTPClient का उपयोग करके आप निश्चित रूप से Restful वेब सेवाओं के साथ बातचीत कर सकते हैं।
हालांकि, यह आमतौर पर एक पुस्तकालय या ढांचे का उपयोग करने के लिए अधिक वांछनीय है जो विशेष रूप से इस उद्देश्य के लिए डिज़ाइन किया गया एक सरल और अधिक अर्थपूर्ण एपीआई प्रदान करता है। यह कोड को लिखना, पढ़ना और डीबग करना आसान बनाता है, और प्रयास के दोहराव को कम करता है। ये फ्रेमवर्क आम तौर पर कुछ महान विशेषताओं को लागू करते हैं जो आवश्यक रूप से निम्न-स्तरीय पुस्तकालयों में उपयोग करने के लिए आसान या आसान नहीं हैं, जैसे कि सामग्री बातचीत, कैशिंग और प्रमाणीकरण।
सबसे परिपक्व विकल्पों में से कुछ हैं जर्सी , RESTEasy , और Restlet ।
मैं रेस्टलेट और जर्सी से सबसे अधिक परिचित हूं, आइए देखें कि हम POST
दोनों एपीआई के साथ कैसे अनुरोध करेंगे।
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());
}
बेशक, GET अनुरोध और भी सरल हैं, और आप इकाई टैग और Accept
हेडर जैसी चीजों को भी निर्दिष्ट कर सकते हैं , लेकिन उम्मीद है कि ये उदाहरण उपयोगी गैर-तुच्छ हैं, लेकिन बहुत जटिल नहीं हैं।
जैसा कि आप देख सकते हैं, रेस्टलेट और जर्सी में समान क्लाइंट एपीआई हैं। मेरा मानना है कि वे एक ही समय के आसपास विकसित हुए थे, और इसलिए एक दूसरे को प्रभावित किया।
मुझे रेस्टलेट एपीआई थोड़ा अधिक अर्थपूर्ण लगता है, और इसलिए थोड़ा स्पष्ट है, लेकिन वाईएमएमवी।
जैसा कि मैंने कहा, मैं रेस्टलेट से सबसे ज्यादा परिचित हूं, मैंने इसे कई सालों तक इस्तेमाल किया है, और मैं इससे बहुत खुश हूं। यह एक बहुत ही परिपक्व, मजबूत, सरल, प्रभावी, सक्रिय और अच्छी तरह से समर्थित ढांचा है। मैं जर्सी या रैस्टैसी से बात नहीं कर सकता, लेकिन मेरी धारणा यह है कि वे दोनों ठोस विकल्प भी हैं।
यह जावा में बहुत जटिल है, यही कारण है कि मैं वसंत के RestTemplate
अमूर्त का उपयोग करने का सुझाव दूंगा:
String result =
restTemplate.getForObject(
"http://example.com/hotels/{hotel}/bookings/{booking}",
String.class,"42", "21"
);
संदर्भ:
RestTemplate
यदि आपको सिर्फ जावा से REST सेवा के लिए एक सरल कॉल करने की आवश्यकता है तो आप इन लाइन के साथ कुछ का उपयोग करें
/*
* 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();
}
}
आसपास कई RESTful API हैं। मैं जर्सी की सिफारिश करूंगा;
ग्राहक एपीआई प्रलेखन यहाँ है;
https://jersey.java.net/documentation/latest/index.html
नीचे टिप्पणी में OAuth डॉक्स के लिए अपडेट स्थान एक मृत लिंक है और इसे https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334 पर ले जाया गया है
मैं अपना व्यक्तिगत अनुभव साझा करना चाहता हूं, पोस्ट JSON कॉल के साथ REST WS को कॉल करना:
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);
}
}
आप सीएक्सएफ की जांच कर सकते हैं । आप यहां JAX-RS आर्टिकल देख सकते हैं
कॉलिंग इस रूप में सरल है (उद्धरण):
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();
वास्तव में, यह "जावा में बहुत जटिल है":
प्रेषक: 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();
सबसे आसान समाधान Apache http क्लाइंट लाइब्रेरी का उपयोग होगा। निम्नलिखित नमूना कोड का संदर्भ लें .. यह कोड प्रमाणीकरण के लिए बुनियादी सुरक्षा का उपयोग करता है।
निर्भरता के बाद जोड़ें।
<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);
मुझे कई उत्तर दिखाई देते हैं, यहाँ हम 2020 WebClient में उपयोग कर रहे हैं , और BTW RestTemplate को निकाला जा रहा है। (यह जाँच कर सकते हैं) RestTemplate को हटा दिया जाएगा
आप Async Http क्लाइंट का उपयोग कर सकते हैं (पुस्तकालय भी WebSocket प्रोटोकॉल का समर्थन करता है ):
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();
}