2014-07-09 6 views
5

लागू करने वाले एक बाकी एपीआई पर अनुमतियां मैं एक पृष्ठ ऐप में अनुमतियों को संभालने का सही तरीका जानने का प्रयास कर रहा हूं जो कई रीस्टफुल एपीआई से सीधे बात करता है, जो हैटोज़ को लागू करता है।HATEOAS

एक उदाहरण के रूप: "। मैं, देख सकते हैं शुरू करने और नौकरियों को थामने लेकिन उन्हें रोक नहीं अपने आवेदन के उपयोगकर्ता के रूप"

/jobs/{आईडी} प्राप्त और डाल स्वीकार करता है कौन सा:

अंतर्निहित बाकी एपीआई निम्न संसाधन है। प्राप्त एक नौकरी मॉडल वापस आती है और PUT रूप में एक अनुरोध शरीर के रूप में एक नौकरी मॉडल स्वीकार करता है:

{ 
"_links" : { 
    "self" : "/jobs/12345678" 
} 
"id" : 12345678, 
"description" : "foo job", 
"state" : "STOPPED" 
} 

स्वीकृत काम राज्यों जा सकता है: निष्क्रिय | चल रहा है | रोका गया | रोका हुआ।

आवश्यकता का कहना है कि मैं बटन यूआई पर करना होगा:,

स्टार्ट, रोकें बंद करो

... और केवल उपयोगकर्ता की अनुमतियों में लॉग इन के आधार पर प्रदर्शित करते हैं।

एपीआई परिप्रेक्ष्य से सर्वर पर अंतर्निहित तर्क के रूप में सबकुछ काम करता है यह सुनिश्चित करता है कि कोई अनुरोध किए जाने पर उपयोगकर्ता राज्य को स्थगित स्थिति में अपडेट नहीं कर सकता (एक 401 शायद वापस आ गया हो)।

उपयोगकर्ता की अनुमतियों के ऐप/UI को सूचित करने का सबसे अच्छा तरीका क्या है, इसलिए यह किसी भी बटन को छुपा सकता है जिसे उपयोगकर्ता को कार्रवाई करने की अनुमति नहीं है?

{ 
"_links" : { 
    "self" : "/permissions", 
    "jobs" : "/jobs" 
} 
"permissions" : { 
    "job" : ["UPDATE", "DELETE"], 
    "job-updates" : ["START", "PAUSE"] 
    } 
} 

या API परिवर्तन ताकि अनुमतियाँ HATEOS लिंक शायद कुछ की तरह में परिलक्षित होते हैं चाहिए::

{ 
"_links" : { 
    "self" : "/jobs/12345678", 
    "start" : "/jobs/12345678/state?to=RUNNING", 
    "pause" : "/jobs/12345678/state?to=PAUSED", 
} 
"id" : 12345678, 
"description" : "foo job", 
"state" : "DORMANT" 
} 

एपीआई, हो सकता है की तरह कुछ अनुमतियों की एक सूची प्रदान करते हैं चाहिए या इसे पूरी तरह से अलग तरीके से किया जाना चाहिए?

अद्यतन

मैं निम्न आलेख जो एक जवाब से पता चलता है मिल गया है: https://softwareengineering.stackexchange.com/questions/215975/how-to-handle-fine-grained-field-based-acl-permissions-in-a-restful-service

उत्तर

5

मैं उत्तरार्द्ध के साथ जाना होगा: आधारित अनुमतियों जिस पर लिंक मौजूद हैं संकेत देते हैं।

यदि लिंक वहां नहीं है, तो उपयोगकर्ता संसाधन तक पहुंच नहीं सकता/कार्रवाई कर सकता है। यदि यह है, तो वे कर सकते हैं। यही वह है जो मैं करता हूं, क्योंकि यह सरल और साफ है और फ्रंट एंड कोड के विवेकानुसार थोड़ा छोड़ देता है। Decoupling, यो।

वैकल्पिक रूप से, अगर आप ऐसा करेंगे प्रत्येक प्रतिक्रिया में सभी लिंक को शामिल करने, लेकिन स्पष्ट रूप से निर्दिष्ट अनुमति दी जाती है और कौन-सी नहीं, अगर आप अपने लिंक लिखने के लिए इस तरह के HAL के रूप में एक प्रारूप का उपयोग करें, जो उसे अपने साथ विस्तार कर सकता है चाहता हूँ प्रत्येक लिंक पर एक झंडा:

{ 
    "_links" : { 
     "self" : { 
      "href":"/jobs/12345678", 
      "allowed":false 
     }, 
     "start" : { 
      "href":"/jobs/12345678/state?to=RUNNING", 
      "allowed":false 
     }, 
     "pause" : { 
      "href":"/jobs/12345678/state?to=PAUSED", 
      "allowed":false 
     } 
    }, 
    "id" : 12345678, 
    "description" : "foo job", 
    "state" : "DORMANT" 
} 
+0

ध्वज के प्रशंसक नहीं, लेकिन उत्तर उत्तर के साथ सहमत हैं। उपलब्ध कार्यों को इंगित करने के लिए लिंक देना हैटियोस के प्रमुख लाभों में से एक है। एक वेब पेज की तरह, अगर कोई प्रविष्टि –

+0

नहीं हटा सकता तो मैं कोई डिलीट बटन नहीं हूं, मैं ध्वज का प्रशंसक नहीं हूं। मुझे लगता है कि ज्यादातर मामलों में, ध्वज उपयुक्त नहीं है, लेकिन मैं देख सकता हूं कि क्यों कुछ मामलों में यह संभव हो सकता है। कभी-कभी प्रसंस्करण स्थिति के कारण एक क्रिया संभव नहीं है, उदाहरण के लिए। हालांकि, इस लिंक को इंगित करने के अन्य तरीके हैं (जैसे कि शरीर में एक विशेषता), और यदि लिंक वास्तव में उपयोग किया जाता है तो उचित अनुरोध कोड को किसी भी अनुरोध पर वापस कर रहा है। – basicallydan

1

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

मैं हाल ही में इस क्षेत्र पर एक ब्लॉग पोस्ट ने लिखा है:

https://www.opencredo.com/2015/08/12/designing-rest-api-fine-grained-resources-hateoas-hal/

+0

आप उस दृष्टिकोण में परिभाषित ऑपरेशन को कैसे परिभाषित करते हैं उदा। पुट आदि? – Dejell

0

आप रूपों, नहीं लिंक का उपयोग कर किया जाना चाहिए, राज्य संक्रमण हाइपरमीडिया प्रदान करने के लिए। यदि आप अपने मीडिया प्रकार में फॉर्म उपलब्ध नहीं करा सकते हैं, तो यूआरआई के लिंक प्रदान करें जो एक्सएचटीएमएल जैसे फॉर्मों का समर्थन करने वाले अन्य मीडिया प्रकार का उपयोग करते हैं।

आईएएनए create-form, edit-form और delete-form इस उद्देश्य के लिए है।

इसके अलावा, कृपया वास्तविक लिंक संबंधों के रूप में start और pause का उपयोग न करें। यदि आप उन्हें स्वयं परिभाषित करते हैं, तो वे यूआरआई (अधिमानतः HTTP यूआरएल होना चाहिए, लेकिन आपके नियंत्रण में कोई यूआरआई पर्याप्त होगा)। start के लिए इसका उपयोग करने के लिए एक पूरी तरह से अलग अर्थ है, और pause परिभाषित नहीं किया गया है।

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