REST API का निर्माण कैसे करें जो संसाधनों के लिए id की एक सरणी लेता है


103

मैं अपने प्रोजेक्ट के लिए REST API बना रहा हूं। किसी उपयोगकर्ता की जानकारी प्राप्त करने के लिए एपीआई है:

api.com/users/[USER-ID]

मैं ग्राहक को यूजर आईडी की सूची में पास होने देना भी चाहूंगा। मैं एपीआई का निर्माण कैसे कर सकता हूं ताकि यह RESTful हो और उपयोगकर्ता आईडी की सूची में हो?


सबसे सामान्य उत्तर @Shuja द्वारा दिया गया है, डाकिया के अन्य जवाब काम नहीं करते हैं और डेटाबेस बैकएंड पर निर्भर हैं। हालाँकि, आपके पास कई आईडी के लिए अनुरोध करने के लिए एपीआई एंड-पॉइंट हो सकता है।
इस्वर

जवाबों:


97

यदि आप URL पर अपने सभी मापदंडों को पारित कर रहे हैं, तो संभवतः अल्पविराम से अलग किए गए मान सबसे अच्छा विकल्प होंगे। फिर आपके पास निम्नलिखित की तरह एक URL टेम्पलेट होगा:

api.com/users?id=id1,id2,id3,id4,id5

7
@ यूक्लाजैट, आरईएसटी एक वास्तुशिल्प मॉडल है और प्रोटोकॉल नहीं है और यदि आप आज उपलब्ध प्रमुख आरईएस एपीआई का अध्ययन करते हैं, तो आप देखेंगे कि इसे लागू करने के कई तरीके हैं। जिस दृष्टिकोण से मैं सुझाव दे रहा हूं, वह संभवतः अवधारणा के सबसे करीब है क्योंकि यह यहां वर्णित सभी बाधाओं को पूरा करता है: en.wikipedia.org/wiki/… । आप अनुरोधों में सरणियों का प्रतिनिधित्व करने के लिए केवल CSV का उपयोग करेंगे, जबकि सेवा प्रतिक्रियाओं को XML या JSON का उपयोग करके क्रमबद्ध किया जाना चाहिए। क्या कोई विशेष कारण हैं कि आप मेरे दृष्टिकोण को REST क्यों नहीं मानते हैं?
फ्लोरिन डुमिट्रेस्क्यू

10
यह क्यों नहीं? api.com/users?id=id1&id=id2&id=id3&id=id4&id=id5
senfo

7
@senfo, मुझे id = id1, id2, id3 पसंद है क्योंकि यह URI को छोटा और पढ़ने में आसान बनाता है (उदाहरण के लिए डिबगिंग ऑपरेशन के दौरान एक मानव द्वारा)। प्रत्येक मान के लिए अलग-अलग पैरामीटर यूआरआई को विशेष रूप से पालन करने के लिए कठिन बनाते हैं यदि आईडी के बीच अन्य पैरामीटर हैं: api.com/users?id=id1&id=id2&joined-after=2013-01-01&id=id3
डुमिट्रेस्कु

12
हालाँकि, अधिकांश वेब सर्वर लगभग 2,000 बाइट्स की URL लंबाई का समर्थन करते हैं। 5,000 आईडी तक मेरा एपीआई समर्थन कैसे करें?
निक_ज़्स

6
@senfo जैसे URL में …?id=1&id=2&id=3, इस बात की कोई गारंटी नहीं है कि डुप्लिकेट क्वेरी पैरामीटर को एक सरणी में जोड़ा जाएगा। उपरोक्त क्वेरी स्ट्रिंग के साथ, PHP आपको यह बताने के लिए होता है कि idबराबरी होती है [1, 2, 3], लेकिन रूबी ऑन रेल्स आपको बताता है कि यह समान है 3, और अन्य फ्रेमवर्क भी अलग-अलग कार्य कर सकते हैं, उदाहरण के लिए idसमान 1…?id=1,2,3इस तरह के भ्रम की स्थिति से बचने के लिए URL पसंद करते हैं ।
रॉरी ओ'केन

33
 api.com/users?id=id1,id2,id3,id4,id5
 api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

IMO, उपरोक्त कॉल Restful नहीं दिखता है, हालांकि ये त्वरित और कुशल वर्कअराउंड (y) हैं। लेकिन URL की लंबाई वेबसर्वर, जैसे कि tomcat द्वारा सीमित है ।

श्रेष्ठ प्रयास:

POST http://example.com/api/batchtask

   [
    {
      method : "GET",
      headers : [..],
      url : "/users/id1"
    },
    {
      method : "GET",
      headers : [..],
      url : "/users/id2"
    }
   ]

सर्वर नव निर्मित बैचटस्क संसाधन के यूआरआई का जवाब देगा ।

201 Created
Location: "http://example.com/api/batchtask/1254"

अब ग्राहक मतदान द्वारा बैच की प्रतिक्रिया या कार्य प्रगति को प्राप्त कर सकते हैं

GET http://example.com/api/batchtask/1254


इस तरह से अन्य लोगों ने इस मुद्दे को हल करने का प्रयास किया:


7
कई परिणाम प्राप्त करने के लिए POST अनुरोध RESTful नहीं है। आपका उदाहरण एक संसाधन बनाने को दर्शाता है, जहाँ यह POST के लिए उपयुक्त है, लेकिन यह मूल प्रश्न से बिलकुल अलग मामला है
Anentropic

2
अस्थायी संसाधन बनाना Restful है, यह नहीं है? और मुझे GET का उपयोग कर संसाधन मिल रहे हैं, फिर से RESTful।
नीलेश

हां, लेकिन उस में से कोई भी मूल प्रश्न में नहीं था, जो सिर्फ कई यूजर आईडी के लिए जानकारी प्राप्त करने के बारे में पूछता है
Anentropic

1
धन्यवाद @Anentropic इंगित करने के लिए। मैं प्रश्न को फिर से पढ़ता हूं यह पूछता है कि संसाधनों के लिए आईडी की एक सरणी बनाने वाले एक REST API का निर्माण कैसे करें? और मैं सहमत हूं, मेरा जवाब अलग है। अपनी बात मनवाने के लिए क्षमा करें।
नीलेश

मुझे यह उत्तर पसंद है क्योंकि कई उपयोगकर्ताओं को प्राप्त करने का Restful तरीका इस तंत्र के माध्यम से है।
शेन कोर्ट्रेल

20

मैं उसी काम को करने का एक और तरीका खोजता हूं @PathParam। यहाँ कोड नमूना है।

@GET
@Path("data/xml/{Ids}")
@Produces("application/xml")
public Object getData(@PathParam("zrssIds") String Ids)
{
  System.out.println("zrssIds = " + Ids);
  //Here you need to use String tokenizer to make the array from the string.
}

निम्नलिखित यूआरएल का उपयोग करके सेवा को बुलाओ।

http://localhost:8080/MyServices/resources/cm/data/xml/12,13,56,76

कहाँ पे

http://localhost:8080/[War File Name]/[Servlet Mapping]/[Class Path]/data/xml/12,13,56,76

5
मुझे यह पसंद है क्योंकि GET सुसंगत है। आप इस उदाहरण में एक नंबर या कई का उपयोग कर सकते हैं। और यह वास्तव में एक खोज (पैरामीटर) नहीं है, जैसा कि आप बैक आईडी दे रहे हैं जो आप चाहते हैं।
markthegrea

1
मैं देख रहा हूँ कि सबसे अधिक उत्कीर्ण उत्तर काम नहीं करता है और आपका उत्तर संभवतः सबसे सामान्य है। उत्तर के रूप में स्वीकार किया जाना चाहिए।
इस्वर

18

जितना मैं इस दृष्टिकोण को पसंद करता हूं: -

    api.com/users?id=id1,id2,id3,id4,id5

सही तरीका है

    api.com/users?ids[]=id1&ids[]=id2&ids[]=id3&ids[]=id4&ids[]=id5

या

    api.com/users?ids=id1&ids=id2&ids=id3&ids=id4&ids=id5

इस तरह से यह रैक करता है। यह कैसे php करता है। इस तरह नोड इसे भी करता है ...


19
मुझे यकीन नहीं है कि PHP मानकों का पालन करने के लिए एक दिशानिर्देश के रूप में संदर्भित करना सबसे अच्छी सलाह है। eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design
trebor

यह नहीं है कि फ्लास्क यह कैसे करता है।
jscul

0

आप ASP.NET MVC का उपयोग करके एक आराम एपीआई या एक आराम परियोजना का निर्माण कर सकते हैं और JSON के रूप में डेटा वापस कर सकते हैं। एक उदाहरण नियंत्रक फ़ंक्शन होगा:

        public JsonpResult GetUsers(string userIds)
        {
           var values = JsonConvert.DeserializeObject<List<int>>(userIds);

            var users = _userRepository.GetAllUsersByIds(userIds);

            var collection = users.Select(user => new { id = user.Id, fullname = user.FirstName +" "+ user.LastName });
            var result = new { users = collection };

            return this.Jsonp(result);
        }
        public IQueryable<User> GetAllUsersByIds(List<int> ids)
        {
            return _db.Users.Where(c=> ids.Contains(c.Id));
        }

तो आप बस गेट्सर्स फ़ंक्शन को एक नियमित AJAX फ़ंक्शन के माध्यम से कॉल करते हैं Ids की सरणी की आपूर्ति (इस मामले में मैं सरणी को स्ट्रिंग के रूप में भेजने के लिए jQuery stringify का उपयोग कर रहा हूं और इसे नियंत्रक में वापस डीमैटरियलाइज़ कर सकता हूं लेकिन आप सिर्फ इन्ट्स की सरणी भेज सकते हैं और प्राप्त कर सकते हैं यह कंट्रोलर में int की एक सरणी के रूप में) है। मैंने ASP.NET MVC का उपयोग करके एक संपूर्ण रेस्टफुल एपीआई का निर्माण किया है जो डेटा को क्रॉस डोमेन जोंस के रूप में लौटाता है और जिसका उपयोग किसी भी ऐप से किया जा सकता है। यदि आप ASP.NET MVC का उपयोग कर सकते हैं तो बेशक।

function GetUsers()
    {
           var link = '<%= ResolveUrl("~")%>users?callback=?';
           var userIds = [];
            $('#multiselect :selected').each(function (i, selected) {
                userIds[i] = $(selected).val();
            });

            $.ajax({
                url: link,
                traditional: true,
                data: { 'userIds': JSON.stringify(userIds) },
                dataType: "jsonp",
                jsonpCallback: "refreshUsers"
            });
    }

3
क्षमा करें, मैं एपीआई लागू करने का तरीका नहीं पूछ रहा था। मैं बस एपीआई यूआरआई का निर्माण करने का तरीका पूछ रहा था ताकि क्लाइंट उपयोगकर्ताओं की एक सरणी के बारे में जानकारी तक पहुंच सके। मैं क्वेरी के मापदंडों के माध्यम से आईडी पास कर सकता हूं, लेकिन मेरा मानना ​​है कि अभ्यस्त बहुत ही शांत होना चाहिए।
युक्लाजैट 20

@ यूक्जाल्ट आपको क्यों लगता है कि रेस्टफुल नहीं है?
डारेल मिलर

1
मेरा मानना ​​है कि क्वेरी मापदंडों के माध्यम से आईडी या किसी भी अन्य मूल्यों को पारित करना वास्तव में एक सिस्टम के साथ बातचीत का एक आरामदायक दृष्टिकोण है। आप कैसे उरी का निर्माण करते हैं यह आपके ऊपर है। यह उपयोगकर्ता / सभी, उपयोगकर्ता / सरणी, सरणी / उपयोगकर्ता या किसी अन्य नामकरण सम्मेलन होने के नाते आपको लगता है कि समझ में आता है। इस बात को ध्यान में रखते हुए कि MVC फ्रेमवर्क एक बहुत ही आसान काम करता है इसका उपयोग आप एक आरामदायक एपीआई के निर्माण के लिए कर सकते हैं जैसा कि आप व्यवस्थित कर सकते हैं और आपको उरिस का निर्माण कर सकते हैं। या यदि आप एक फॉर्म का उपयोग कर रहे हैं और एक एमवीसी कार्रवाई के लिए एक पोस्ट कर रहे हैं तो कई मूल्यों के रूप में।
वासिल लॉर

1
@ यूक्जाल्ट थाट्स अब तक दो बार इस पोस्ट पर आपसे पूछा गया है कि आपको क्यों लगता है कि एक क्वेरी पैरामीटर में अल्पविराम से अलग की गई सूची उत्तीर्ण नहीं है और आप इसका उत्तर देने की जहमत नहीं उठाते हैं, अकेले इन बहुत प्रशंसनीय समाधानों को स्वीकार करें? ! अछा नहीं लगता।
समिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.