2010-12-27 9 views
75

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

api.com/users/[USER-ID] 

मैं भी ग्राहक उपयोगकर्ता आईडी की सूची में पारित करने के लिए अनुमति देने के लिए करना चाहते हैं। मैं एपीआई कैसे बना सकता हूं ताकि यह रीस्टफुल हो और उपयोगकर्ता आईडी की सूची ले सके?

उत्तर

74

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

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

इस दृष्टिकोण के साथ समस्या यह है कि यह नहीं करता शोकहारा लग रहे है। उदाहरण के लिए यदि मैं उपयोगकर्ताओं की इस सूची के दोस्तों को – uclajatt

+6

@uclajatt प्राप्त करना चाहता हूं, आरईएसटी एक वास्तुशिल्प मॉडल है और प्रोटोकॉल नहीं है और यदि आप आज उपलब्ध प्रमुख आरईएसटी एपीआई का अध्ययन करते हैं, तो आप देखेंगे कि इसे लागू करने के कई तरीके हैं। जिस दृष्टिकोण का मैं सुझाव दे रहा हूं वह शायद अवधारणा के सबसे नज़दीकी में से एक है क्योंकि यह यहां वर्णित सभी बाधाओं को पूरा करता है: http://en.wikipedia.org/wiki/Representational_State_Transfer#Constraints। आप अनुरोधों में सरणी का प्रतिनिधित्व करने के लिए केवल सीएसवी का उपयोग करेंगे, जबकि सेवा प्रतिक्रियाओं को एक्सएमएल या जेएसओएन का उपयोग करके क्रमबद्ध किया जाना चाहिए। क्या कोई विशेष कारण हैं कि आप मेरे दृष्टिकोण को आरईएसटी क्यों नहीं मानते? –

+3

फ्लोरिन का उत्तर ओपनसामाजिक एपीआई का वास्तविक तरीका है। – Emerald214

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 समारोह (आईडी की सरणी इस मामले मैं jQuery का उपयोग कर रहा में आपूर्ति के माध्यम से GetUsers फ़ंक्शन को कॉल स्ट्रिंग के रूप में सरणी भेजने के लिए और यह dematerialize को stringify नियंत्रक में वापस लेकिन आप केवल इंक की सरणी भेज सकते हैं और इसे नियंत्रक में int की सरणी के रूप में प्राप्त कर सकते हैं)। मैंने एएसपी.नेट एमवीसी का उपयोग करके एक संपूर्ण रेस्टफॉल एपीआई बनाया है जो डेटा को क्रॉस डोमेन जेसन के रूप में लौटाता है और इसका उपयोग किसी ऐप से किया जा सकता है। निश्चित रूप से यदि आप एएसपी.नेट एमवीसी का उपयोग कर सकते हैं।

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

क्षमा करें, मैं' एपीआई को कैसे कार्यान्वित करना चाहता हूं। ' सिर्फ एपीआई यूआरआई बनाने के बारे में पूछ रहा था ताकि ग्राहक उपयोगकर्ताओं की एक सरणी के बारे में जानकारी प्राप्त कर सके। मैं क्वेरी पैरामीटर के माध्यम से आईडी पास कर सकता हूं, लेकिन मेरा मानना ​​है कि 'बहुत आराम से नहीं होगा। – uclajatt

+0

@uclajatt आपको क्यों लगता है कि यह सही नहीं है? –

+1

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

14

मुझे @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 
+4

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

14

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

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 

यह rack करता है। इस प्रकार php यह करता है। यह

+13

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

+1

इस प्रकार कोणीय (google) यह भी करता है –

21
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) कर रहे हैं लगता है करता है कि कैसे नोड यह रूप में अच्छी तरह से करता है है ...। लेकिन यूआरएल की लंबाई वेबसर्वर द्वारा सीमित है, उदाहरण के लिए tomcat

RESTful प्रयास:

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

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

सर्वर नव निर्मित batchtask संसाधन का यूआरआई उत्तर देगा।

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

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

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


यक्ति इस समस्या को हल करने के लिए का प्रयास किया जाता है:

+2

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

+2

के लिए यह एक बिल्कुल अलग मामला है अस्थायी संसाधन बनाना विश्वसनीय है, है ना? और मुझे जीईटी का उपयोग करके संसाधन मिल रहा है, यह फिर से सही है। – Nilesh

+0

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

संबंधित मुद्दे