Java में RESTful कॉल


150

मैं जावा में एक RESTful कॉल करने जा रहा हूं। हालाँकि, मुझे नहीं पता कि कॉल कैसे करें। क्या मुझे URLConnection या अन्य का उपयोग करने की आवश्यकता है? क्या कोई मेरी मदद कर सकता है। धन्यवाद।


यह निर्भर करता है कि आप अपने आवेदन में बाकी कॉल कैसे करते हैं। क्या आप एक JavaRS कार्यान्वयन का उपयोग करते हैं? एक विशेष? क्या आप मैन्युअल रूप से अनुरोध कर रहे हैं?
कॉलिन हेबर्ट

@ कोलिन हेबर्ट, आपके उत्तर के लिए धन्यवाद। लेकिन मेरे पास Restful कॉल का कोई विचार नहीं है। क्या आप मुझे RESTful कॉल के विभिन्न हिस्सों के बारे में अधिक जानकारी दे सकते हैं।
प्रश्न

चेकआउट http रेस्टफुल क्लाइंट यहाँ क्लिक करें
गौरव J

जवाबों:


91

यदि आप किसी सेवा प्रदाता (जैसे कि फेसबुक, ट्विटर) से 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


5
पहिए को सुदृढ़ न करें, मौजूदा RESTful कार्यान्वयन में से एक का उपयोग करें।
क्वर्की

13
यह पहिया को सुदृढ़ नहीं कर रहा है, मैं कह रहा हूं कि आप जो flavourचाहें उपयोग कर सकते हैं। कुछ डिफ़ॉल्ट चाहते हैं URLConnection, कुछ चाहते हैं HttpClient। किसी भी तरह से, यह आप का उपयोग करने के लिए है।
बुहके सिंडी

@ द एलीट जेंटलमैन, आपके उत्तर के लिए धन्यवाद। पुस्तकालय के सभी की जाँच करने के बाद, मैं अपाचे HttpClient का उपयोग करना चाहता हूं, क्या आप मुझे इस बारे में अधिक संदर्भ देना चाहेंगे?
प्रश्न

@ प्रश्न, HttpClient 4 उदाहरणों का लिंक टूटा हुआ प्रतीत होता है, इसलिए यदि आपके कोई प्रश्न हैं (वाक्य का उद्देश्य ... योग्य), तो मुझे बताएं .... मैं इसके साथ लगभग दैनिक व्यवहार करता हूं।
बुहके सिंडी

कृपया इन वर्गों का उपयोग करने के तरीके का उदाहरण कोड दिखाएं, न कि केवल उनके अस्तित्व को ध्यान में रखते हुए
जोनाथन

150

अद्यतन: जब से मैंने नीचे उत्तर लिखा है लगभग 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हेडर जैसी चीजों को भी निर्दिष्ट कर सकते हैं , लेकिन उम्मीद है कि ये उदाहरण उपयोगी गैर-तुच्छ हैं, लेकिन बहुत जटिल नहीं हैं।

जैसा कि आप देख सकते हैं, रेस्टलेट और जर्सी में समान क्लाइंट एपीआई हैं। मेरा मानना ​​है कि वे एक ही समय के आसपास विकसित हुए थे, और इसलिए एक दूसरे को प्रभावित किया।

मुझे रेस्टलेट एपीआई थोड़ा अधिक अर्थपूर्ण लगता है, और इसलिए थोड़ा स्पष्ट है, लेकिन वाईएमएमवी।

जैसा कि मैंने कहा, मैं रेस्टलेट से सबसे ज्यादा परिचित हूं, मैंने इसे कई सालों तक इस्तेमाल किया है, और मैं इससे बहुत खुश हूं। यह एक बहुत ही परिपक्व, मजबूत, सरल, प्रभावी, सक्रिय और अच्छी तरह से समर्थित ढांचा है। मैं जर्सी या रैस्टैसी से बात नहीं कर सकता, लेकिन मेरी धारणा यह है कि वे दोनों ठोस विकल्प भी हैं।


2
लेकिन फिर भी एक महान पोस्ट। और मुझे "99% उस समय से सहमत होना होगा जब लोग REST शब्द का उपयोग करते हैं, उनका वास्तव में HTTP मतलब होता है; ... विभिन्न REST फ्रेमवर्क द्वारा प्रदान किए गए अमूर्त इसलिए भ्रामक और अनपेक्षित हैं।"
एलेक्सडी

2
आपके जर्सी उदाहरण में, फॉर्म ऑब्जेक्ट का उपयोग कहां / कैसे किया जाता है? यह बनाया गया है, लेकिन यह उदाहरण के लिए कुछ भी जोड़ने के लिए प्रकट नहीं होता है।
Splungebob

29

यह जावा में बहुत जटिल है, यही कारण है कि मैं वसंत के RestTemplateअमूर्त का उपयोग करने का सुझाव दूंगा:

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

संदर्भ:


24

यदि आपको सिर्फ जावा से 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();
    }
}

1
आसपास कुछ बहुत अच्छे REST एपीआई हैं, मैं पहिया को सुदृढ़ करने के बजाय एक का उपयोग करने की सलाह दूंगा।
क्वर्की

जैसा कि मैंने कहा: नरक के रूप में जटिल। (नहीं, मैंने इसे कम नहीं किया, यह पूरी तरह से वैध समाधान है)
सीन पैट्रिक फ्लोयड

4
@Qwerky क्लाइंट साइड API लाइब्रेरी आमतौर पर REST बाधाओं का उल्लंघन है। वे बहुत अधिक युग्मन का परिचय देते हैं। लंबे समय में एक अच्छा HTTP लाइब्रेरी का उपयोग करना बेहतर विकल्प है।
डारेल मिलर

10

आसपास कई RESTful API हैं। मैं जर्सी की सिफारिश करूंगा;

https://jersey.java.net/

ग्राहक एपीआई प्रलेखन यहाँ है;

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


नीचे टिप्पणी में OAuth डॉक्स के लिए अपडेट स्थान एक मृत लिंक है और इसे https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334 पर ले जाया गया है


6
ओपी एक Restful एप्लिकेशन नहीं बना रहा है, वह RESTful कॉल कर रहा है, अर्थात Twitter API विधि संसाधन को कॉल करना।
बुहके सिंडी

@ क्यूवर्की - मुझे लगता है कि यह शामिल करना उपयोगी होगा कि आप अपने उत्तर में जर्सी की सिफारिश क्यों करते हैं।
डैनी बुलिस

7

मैं अपना व्यक्तिगत अनुभव साझा करना चाहता हूं, पोस्ट 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);
    }
}

5

आप सीएक्सएफ की जांच कर सकते हैं । आप यहां 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();

5

वास्तव में, यह "जावा में बहुत जटिल है":

प्रेषक: 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

सबसे आसान समाधान 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);

1

मुझे कई उत्तर दिखाई देते हैं, यहाँ हम 2020 WebClient में उपयोग कर रहे हैं , और BTW RestTemplate को निकाला जा रहा है। (यह जाँच कर सकते हैं) RestTemplate को हटा दिया जाएगा


लिंक प्रदान करने के बजाय आप यहाँ स्पष्टीकरण जोड़ सकते हैं?
किशन भराड़ा

-1

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

यह काम नहीं करता है (ASyncHttpClient को संस्थापित नहीं कर सकता है)।
जावा मुख्य
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.