आप जावा के लिए REST क्लाइंट कैसे बनाते हैं? [बन्द है]


248

JSR 311 और इसके कार्यान्वयन के साथ हमारे पास जावा ऑब्जेक्ट्स को REST के माध्यम से उजागर करने के लिए एक शक्तिशाली मानक है। हालाँकि क्लाइंट की तरफ से ऐसा कुछ याद आ रहा है जो एसओएपी के लिए अपाचे एक्सिस की तुलना में है - ऐसा कुछ जो वेब सेवा को छुपाता है और डेटा को जावा ऑब्जेक्ट में पारदर्शी रूप से वापस लाता है।

आप जावा रेस्टफुल क्लाइंट कैसे बनाते हैं? परिणाम का HTTPConnection और मैन्युअल पार्सिंग का उपयोग करना? या उदा। जर्सी या अपाचे सीएक्सआर के लिए विशेष ग्राहक?


बस अपाचे इनक्यूबेटर में अपाचे विंक मिला । REST सर्वर और क्लाइंट बनाने के लिए एक दिलचस्प परियोजना हो सकती है।
यबा

2
इसे देखें: igorpolevoy.blogspot.com/2011/01/java-rest-with-ease.html धन्यवाद igor
ipolevoy

[आराम करें] ( code.google.com/p/resting ) देखें। यह REST सेवाओं को लागू करने और एक चरण में XML / JSON / YAML प्रतिक्रिया से वस्तुओं की सूची बनाने का वादा करता है।
नील

आराम करने के लिए POST अनुरोधों के साथ समस्याएँ हैं।
रयान ब्रैडी

2
आप इसे बहुत ही सरल तरीके से रेस्टेसी (जबॉस द्वारा) कर सकते हैं। यदि आप एक आरंभ गाइड चाहते हैं तो मैंने एक जावा रीस्ट क्लाइंट को कैसे विकसित किया जाए, इसके बारे में एक ब्लॉग पोस्ट लिखा था । वैसे भी, जावा में सैकड़ों विकल्प हैं।
ग्यूडो

जवाबों:


205

यह एक पुराना सवाल है (2008) तो वहाँ अब पहले की तुलना में कई अधिक विकल्प हैं:

अद्यतन (अभी भी परियोजनाएं 2020 में सक्रिय हैं):

  • Apache HTTP Components (4.2) धाराप्रवाह एडाप्टर - JDK के लिए मूल प्रतिस्थापन, इस सूची में कई अन्य उम्मीदवारों द्वारा उपयोग किया जाता है। पुराने कॉमन्स HTTP क्लाइंट 3 से बेहतर और अपने स्वयं के REST क्लाइंट के निर्माण के लिए उपयोग करना आसान है। आपको JSON पार्सिंग समर्थन के लिए जैक्सन जैसे कुछ का उपयोग करना होगाऔर आपजर्सी / जेएक्स-आरएस रेस्ट क्लाइंट के समान संसाधन यूआरआई के निर्माण के लिए HTTP घटकों URIBuilder का उपयोग कर सकते हैं। HTTP घटक भी NIO का समर्थन करते हैं, लेकिन मुझे संदेह है कि BIO की तुलना में आपको बेहतर प्रदर्शन मिलेगा, REST का संक्षिप्त अनुरोध। Apache HttpCompords 5 में HTTP / 2 सपोर्ट है।
  • OkHttp - JDK के लिए मूल प्रतिस्थापन, HTTP घटकों के समान, इस सूची में कई अन्य उम्मीदवारों द्वारा उपयोग किया जाता है। नए HTTP प्रोटोकॉल (SPDY और HTTP2) का समर्थन करता है। Android पर काम करता है। दुर्भाग्य से यह एक वास्तविक रिएक्टर-लूप आधारित async विकल्प प्रदान नहीं करता है (ऊपर निंग और HTTP घटकों को देखें)। हालाँकि यदि आप नए HTTP2 प्रोटोकॉल का उपयोग करते हैं तो यह एक समस्या से कम है (कनेक्शन की गिनती समस्या है)।
  • निंग Async-http-client - NIO समर्थन प्रदान करता है। पहले सोनटाइप द्वारा Async-http-client के रूप में जाना जाता था।
  • बहाना करना निचले स्तर http ग्राहकों के लिए आवरण (okhttp, अपाचे httpcomponents)। कुछ जर्सी और सीएक्सएफ एक्सटेंशन के समान इंटरफ़ेस स्टब्स पर आधारित ऑटो-क्लाइंट। मजबूत वसंत एकीकरण।
  • पुराना वापस - निचले स्तर http ग्राहकों (okhttp) के लिए आवरण। कुछ जर्सी और सीएक्सएफ एक्सटेंशन के समान इंटरफ़ेस स्टब्स पर आधारित ऑटो-क्लाइंट।
  • गूगल द्वारा jdk http क्लाइंट के लिए वॉली रैपर
  • jdk http क्लाइंट के लिए google-http रैपर, या google द्वारा अपाचे httpcompenders
  • Jdk http क्लाइंट के लिए Unongest आवरण, kong द्वारा
  • जेडीसी http क्लाइंट के लिए जकार्ताई रेपर को रेबेसी, जेबॉस द्वारा, जॉब फ्रेमवर्क का हिस्सा
  • Apache httpcompenders के लिए jcabi-http रैपर, jcabi कलेक्शन का हिस्सा
  • Apache httpcompenders के लिए टॉयलेट रैपर, टॉयलेट ढांचे का हिस्सा
  • आराम से परीक्षण के लिए आश्वासन के साथ बाकी का आश्वासन दिया आवरण

HTTP / REST क्लाइंट चुनने पर एक चेतावनी। यह सुनिश्चित करने के लिए सुनिश्चित करें कि HTTP क्लाइंट के लिए आपका फ्रेमवर्क स्टैक क्या उपयोग कर रहा है, यह थ्रेडिंग कैसे करता है, और यदि यह एक ऑफर देता है तो उसी क्लाइंट का आदर्श रूप से उपयोग करें। अगर आपके वर्टॉक्स.एक्स या प्ले जैसी किसी चीज़ का उपयोग करने से आप अपने बैकिंग क्लाइंट को बस या रिएक्टर लूप में जो भी फ्रेमवर्क प्रदान करते हैं, उसमें भाग लेने का प्रयास करने की कोशिश कर सकते हैं ... अन्यथा संभवतः दिलचस्प थ्रेडिंग मुद्दों के लिए तैयार रहें।


1
दुर्भाग्य से जर्सी क्लाइंट JDK <8 के साथ प्रयोग होने पर PATCH विधि का समर्थन नहीं करता है
बॉटनकियाक

3
Unirest का उपयोग करना बहुत आसान है लेकिन इसका स्थिर डिज़ाइन इसे साझा और सर्वर वातावरण में अनुपयोगी बनाता है।
bekce

9
असंबद्ध टिप्पणी के बारे में , मैं यह जोड़ना चाहूंगा कि यह वर्तमान में (2016 के अंत में) लग रहा है जैसे कि यह परियोजना अब बनाए नहीं रखी गई है। यहां तक ​​कि एक मुद्दा खुला है जो एक नए अनुचर के लिए पूछता है।
वीजेनमिक ऑक्ट

4
Unirest पसंद करने वालों के लिए , मुझे इसका एक कांटा मिल गया है जिसे वर्तमान में सक्रिय रूप से बनाए रखा / अद्यतन किया जा रहा है।
जोश

3
उत्तर को एक समुदाय विकी में बदलना अच्छा होगा
tkruse

72

जैसा कि मैंने इस सूत्र में उल्लेख किया है कि मैं जर्सी का उपयोग करता हूं, जो JAX-RS को लागू करता है और एक अच्छा REST क्लाइंट के साथ आता है। अच्छी बात यह है कि यदि आप JAX-RS का उपयोग करके अपने RESTful संसाधनों को लागू करते हैं तो जर्सी क्लाइंट JAXB / XML / JSON / Atom और इसके आगे जैसे इकाई प्रदाताओं का पुन: उपयोग कर सकता है - इसलिए आप सर्वर पर उन्हीं वस्तुओं का पुन: उपयोग कर सकते हैं जैसे आप ग्राहक पक्ष इकाई परीक्षण पर उपयोग करें।

उदाहरण के लिए यहां अपाचे कैमल प्रोजेक्ट से एक यूनिट टेस्ट केस है जो एक रैस्टफुल रिसोर्स से XML पेलोड दिखता है (JAXB ऑब्जेक्ट एंडपॉइंट्स का उपयोग करके)। इस बेस क्लास में संसाधन (यूआरआई) पद्धति को परिभाषित किया गया है जो सिर्फ जर्सी क्लाइंट एपीआई का उपयोग करता है।

जैसे

    clientConfig = new DefaultClientConfig();
    client = Client.create(clientConfig);

    resource = client.resource("http://localhost:8080");
    // lets get the XML as a String
    String text = resource("foo").accept("application/xml").get(String.class);        

BTW मुझे उम्मीद है कि JAX-RS का भावी संस्करण जर्सी में एक की तर्ज पर एक अच्छा क्लाइंट साइड एपीआई जोड़ देगा


क्या कोई विधि है जहाँ हम क्लाइंट सर्वर में REST सेवा सर्वर सूची का उल्लेख कर सकते हैं, यदि सर्वर नीचे है तो अगला सर्वर आज़माएं?
Njax3SmmM2x2a0Zf7Hpd

1
बस एक अपडेट, लेकिन जेम्स '' BTW '' टिप्पणी को संबोधित करने के लिए, JAX-RS 2.0 के नए संस्करण में एक क्लाइंट-साइड API होगा: infoq.com/pretations/Java-REST
निक क्लाऊयर

65

आप मानक जावा एसई एपीआई का उपयोग कर सकते हैं:

private void updateCustomer(Customer customer) { 
    try { 
        URL url = new URL("http://www.example.com/customers"); 
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        connection.setDoOutput(true); 
        connection.setInstanceFollowRedirects(false); 
        connection.setRequestMethod("PUT"); 
        connection.setRequestProperty("Content-Type", "application/xml"); 

        OutputStream os = connection.getOutputStream(); 
        jaxbContext.createMarshaller().marshal(customer, os); 
        os.flush(); 

        connection.getResponseCode(); 
        connection.disconnect(); 
    } catch(Exception e) { 
        throw new RuntimeException(e); 
    } 
} 

या आप JAX-RS क्रियान्वयन जैसे जर्सी के द्वारा दिए गए REST क्लाइंट API का उपयोग कर सकते हैं। इन एपीआई का उपयोग करना आसान है, लेकिन आपके वर्ग पथ पर अतिरिक्त जार की आवश्यकता होती है।

WebResource resource = client.resource("http://www.example.com/customers"); 
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer."); 
System.out.println(response); 

अधिक जानकारी के लिए देखें:


15
2018 में एक साधारण रेस्ट कॉल के लिए 13 लाइनें, बहुत ज्यादा लगता है ...
क्लिंट ईस्टवुड

1
एक बार जब आप त्रुटि हैंडलिंग और विकल्प जोड़ते हैं, तो यह वास्तव में बहुत अलग नहीं है। यदि एसई दृष्टिकोण लंबा लगता है, तो आप इसे हमेशा एक कक्षा में लपेट सकते हैं ...:> दो दिनों के डेब्यू के बाद जेएएक्स-आरएस लाइब्रेरी का टकराव होता है मैं पूरे एसपीआई दुःस्वप्न से बचने के लिए कोड की 5 अतिरिक्त लाइनों के साथ वास्तव में ठीक हूं।
टेकहेड

2
@ClintEastwood यह पोस्ट 2010 में लिखा गया था
0ddlyoko

13

यदि आप केवल एक REST सेवा को लागू करना चाहते हैं और उस प्रतिक्रिया को पार्स करें जिसे आप रेस्ट एश्योर्ड आज़मा सकते हैं

// Make a GET request to "/lotto"
String json = get("/lotto").asString()
// Parse the JSON response
List<String> winnderIds = with(json).get("lotto.winners.winnerId");

// Make a POST request to "/shopping"
String xml = post("/shopping").andReturn().body().asString()
// Parse the XML
Node category = with(xml).get("shopping.category[0]");

मैंने इसे अन्य प्रस्तावित समाधानों की तुलना में अधिक सुरुचिपूर्ण पाया।
हेव मुतम्बो

9

आप रेस्टलेट की जांच भी कर सकते हैं जिसमें पूर्ण क्लाइंट-साइड क्षमताएं हैं, अधिक REST उन्मुख है जो निम्न-स्तरीय लाइब्रेरी जैसे HttpURLConnection या Apache HTTP क्लाइंट (जिसे हम कनेक्टर के रूप में लाभ उठा सकते हैं)।

सादर, जेरोम लुईवेल


2
2019-10-24 तक, लिंक ने रिटर्न प्रदान किया: 'रेस्टलेट प्लेटफ़ॉर्म जीवन के अंत तक पहुंच गया है।'
हंस डेरगन

6

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


1
रापा के पास बहुत अच्छा इंटरफ़ेस और कुछ निर्भरताएँ हैं। .NET दुनिया में RestSharp का एक अच्छा विकल्प।
दोपहर

परियोजना मृत दिखती है
tkruse

6

मैं 2 और विकल्प बताना चाहूंगा:


1
रेस्टोफी मरा हुआ दिखता है
trruse

6

Jcabi-http (मैं एक डेवलपर हूं) JdkRequestसे कोशिश करें । यह इस तरह काम करता है:

String body = new JdkRequest("http://www.google.com")
  .header("User-Agent", "it's me")
  .fetch()
  .body()

अधिक जानकारी के लिए इस ब्लॉग पोस्ट की जाँच करें: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html


5

मैंने हाल ही में स्क्वायर से रेट्रोफिट लाइब्रेरी की कोशिश की है , यह बहुत अच्छा है और आप अपने बाकी एपीआई को बहुत आसानी से कॉल कर सकते हैं। एनोटेशन आधारित कॉन्फ़िगरेशन हमें बहुत सारे बॉयलर प्लेट कोडिंग से छुटकारा पाने की अनुमति देता है।


4

मैं सभी HTTP पक्ष की चीजों को संभालने के लिए Apache HTTPClient का उपयोग करता हूं।

मैं XML SAX पार्सर्स को XML सामग्री के लिए लिखता हूं जो XML को आपके ऑब्जेक्ट मॉडल में पार्स करता है। मेरा मानना ​​है कि एक्सिस 2 एक्सएमएल -> मॉडल के तरीकों को भी उजागर करता है (एक्सिस 1 ने इस हिस्से को झुंझलाहट से छिपा दिया)। XML जनरेटर तुच्छ रूप से सरल हैं।

यह कोड में लंबा समय नहीं लेता है, और मेरी राय में, काफी कुशल है।


4
मेरी राय में यह REST करने का सबसे बुरा तरीका है। जावा में मैन्युअल रूप से क्रमांकन संभालना समय की बर्बादी है जब आपके पास JAXB और जैक्सन जैसे कई विकल्प हैं। यहां तक ​​कि पूरे दस्तावेज़ को लोड करना और XPath का उपयोग करना SAX की तुलना में थोड़ा धीमा है और XML (नेटवर्क स्पीड) प्राप्त करने की तुलना में कुछ भी नहीं है।
एडम गेंट

1
मैं भी सहमत हूं, और मैंने मूल टिप्पणी लिखी है। वापस तो मैं deserialisation के नियंत्रण के लिए एक इच्छा थी, लेकिन आजकल मैं जैक्सन का उपयोग करेगा और शालीनता से मॉडल वर्गों का अनावरण किया।
JeeBee

4

जब रेट्रोफिट के साथ भी ओकेहटप हल्का और शक्तिशाली होता है। यह सामान्य जावा उपयोग के साथ-साथ एंड्रॉइड पर भी अच्छा काम करता है।

OkHttp : http://square.github.io/okhttp/

public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

रेट्रोफिट : http://square.github.io/retrofit/

public interface GitHubService {
  @GET("/users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}


2

हालांकि इसका एक HTTP क्लाइंट बनाने और फिर से बनाने के लिए सरल है। लेकिन अगर आप कुछ ऑटो जेनरेट किए गए क्लाइंट का उपयोग करना चाहते हैं, तो आप कोड का वर्णन करने और उत्पन्न करने के लिए WADL का उपयोग कर सकते हैं।

आप WSDL को जेनरेट करने और संकलित करने के लिए रेस्टडेसट्यू का उपयोग कर सकते हैं, आप इसका उपयोग करके php, रूबी, पाइथन, जावा और C # में क्लाइंट उत्पन्न कर सकते हैं। यह साफ कोड उत्पन्न करता है और एक अच्छा बदलाव है कि आपको कोड पीढ़ी के बाद इसे थोड़ा मोड़ना होगा, आप यहां टूल के पीछे अच्छे दस्तावेज और अंतर्निहित विचार पा सकते हैं ।

कुछ दिलचस्प और उपयोगी WADL उपकरण विंटरम्यूट पर उल्लिखित हैं।


1

मैंने एक पुस्तकालय लिखा था जो एक जावा इंटरफेस को दूरस्थ JSON REST सेवा में मैप करता है:

https://github.com/ggeorgovassilis/spring-rest-invoker

public interface BookService {
   @RequestMapping("/volumes")
   QueryResult findBooksByTitle(@RequestParam("q") String q);

   @RequestMapping("/volumes/{id}")
   Item findBookById(@PathVariable("id") String id);
}

1

रेस्ट सर्विस को पार्स करने और सर्विस टेस्ट करने के लिए मैंने ज्यादातर समय रेस्टएश्योर का इस्तेमाल किया । रेस्ट एश्योर्ड के अलावा, मैंने नीचे दी गई लाइब्रेरियों का भी इस्तेमाल किया, ताकि रेसुफ़ सेवाओं के साथ संवाद किया जा सके।

ए। जर्सी रेस्ट क्लाइंट

ख। स्प्रिंग रेस्टप्लेट

सी। अपाचे HTTP क्लाइंट


0

Http-rest-client को देखने का प्रयास करें

https://github.com/g00dnatur3/http-rest-client

ये रहा एक सरल उदाहरण:

RestClient client = RestClient.builder().build();
String geocoderUrl = "http://maps.googleapis.com/maps/api/geocode/json"
Map<String, String> params = Maps.newHashMap();
params.put("address", "beverly hills 90210");
params.put("sensor", "false");
JsonNode node = client.get(geocoderUrl, params, JsonNode.class);

पुस्तकालय आपके लिए जसन क्रमांकन और बंधन का ख्याल रखता है।

यहाँ एक और उदाहरण है,

RestClient client = RestClient.builder().build();
String url = ...
Person person = ...
Header header = client.create(url, person);
if (header != null) System.out.println("Location header is:" + header.value());

और एक अंतिम उदाहरण,

RestClient client = RestClient.builder().build();
String url = ...
Person person = client.get(url, null, Person.class); //no queryParams

चीयर्स!


0

जर्सी रेस्ट क्लाइंट के उदाहरण:
निर्भरता जोड़ना:

         <!-- jersey -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>
   <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
    </dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.8</version>
</dependency>

    <dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

ForGetMethod और दो पैरामीटर पास करना:

          Client client = Client.create();
           WebResource webResource1 = client
                        .resource("http://localhost:10102/NewsTickerServices/AddGroup/"
                                + userN + "/" + groupName);

                ClientResponse response1 = webResource1.get(ClientResponse.class);
                System.out.println("responser is" + response1);

GetMethod एक पैरामीटर पास करना और सूची का प्रतिसाद प्राप्त करना:

       Client client = Client.create();

        WebResource webResource1 = client
                    .resource("http://localhost:10102/NewsTickerServices/GetAssignedUser/"+grpName);    
    //value changed
    String response1 = webResource1.type(MediaType.APPLICATION_JSON).get(String.class);

    List <String > Assignedlist =new ArrayList<String>();
     JSONArray jsonArr2 =new JSONArray(response1);
    for (int i =0;i<jsonArr2.length();i++){

        Assignedlist.add(jsonArr2.getString(i));    
    }

ऊपर में यह एक सूची देता है जिसे हम एक सूची के रूप में स्वीकार कर रहे हैं और फिर इसे Json Array और फिर Json Array को List में परिवर्तित करते हैं।

यदि पोस्ट अनुरोध जेंस ऑब्जेक्ट को पैरामीटर के रूप में पारित कर रहा है:

   Client client = Client.create();
    WebResource webResource = client
            .resource("http://localhost:10102/NewsTickerServices/CreateJUser");
    // value added

    ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class,mapper.writeValueAsString(user));

    if (response.getStatus() == 500) {

        context.addMessage(null, new FacesMessage("User already exist "));
    }

0

मैं वर्तमान में https://github.com/kevinsawicki/http-request का उपयोग कर रहा हूं, मुझे उनकी सादगी पसंद है और जिस तरह से उदाहरण दिखाए जाते हैं, लेकिन जब मैं पढ़ता था तो ज्यादातर मुझे बेचा जाता था:

निर्भरताएं क्या हैं?

कोई नहीं। इस पुस्तकालय का लक्ष्य कुछ आंतरिक स्थिर वर्गों के साथ एकल वर्ग वर्ग होना है। परीक्षण प्रोजेक्ट को वास्तविक HTTP सर्वर कार्यान्वयन के विरुद्ध अनुरोधों का परीक्षण करने के लिए जेट्टी की आवश्यकता होती है।

जो एक जावा 1.6 परियोजना पर कुछ समस्याओं को हल करता है। वस्तुओं को आगजनी में डिकोड करने के लिए के रूप में सिर्फ अजेय है :)


1
प्रोजेक्ट मृत लग रहा है, 2015 से कोई कमिट नहीं है
trruse
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.