2012-05-02 4 views
7

मैं मौजूदा डब्ल्यूसीएफ सेवा को वेबएपीआई में परिवर्तित करके वेबएपीआई (और सामान्य रूप से आरईएसटी) सीख रहा हूं। इस प्रक्रिया में, मैं गैर-सीआरयूडी संचालन को संभालने के सर्वोत्तम तरीके के रूप में भ्रमित हो रहा हूं।एक विश्वसनीय (वेबएपीआई) सेवा में गैर-सीआरयूडी संचालन

[ServiceContract] 
public interface IProxyHelper 
{ 
    [OperationContract] 
    List<ProxyInfo> GetUsersCurrentUserCanActAsProxyFor(int positionId, int appId); 

    [OperationContract] 
    void DeleteProxy(int id); 

    [OperationContract] 
    List<ProxyInfo> GetProxyData(int appId); 

    [OperationContract] 
    bool CanPositionProxy(int positionId, int appId); 

    [OperationContract] 
    void AddProxy(
     string userRacf, 
     string proxyAsRacf, 
     int userPositionId, 
     int proxyPositionId, 
     string requestedByRacf, 
     int appId); 

    [OperationContract] 
    int GetPositionIdByRacf(string racf); 

    [OperationContract] 
    string GetRacfByPositionId(int positionId); 
} 

तरीकों, DeleteProxy तरह से कुछ और AddProxy मैं आसानी से एक CRUD आधारित पद्धति के लिए स्थानांतरित कर सकते हैं: यहाँ मेरी सेवा अनुबंध है।

सवालों के चारों ओर उठता है:

GetProxyData - प्रॉक्सी प्रणाली से अधिक आवेदन के द्वारा प्रयोग किया जाता है, और हालांकि मैं एपीआई कर सकता/प्रॉक्सी/1, मुझे लगता है कि "धोखा दे" क्योंकि है कि हो रही ProxyId 1 के लिए होना चाहिए, आवेदन के लिए प्रॉक्सी नहीं 1.

GetUsersCurrentUserCanActAsProxyFor - यह मेरे लिए कई स्तरों पर भ्रमित है। मुझे एकाधिक पैरामीटर कैसे संभालना चाहिए? और यह सीआरयूडी विधि में अच्छी तरह से गिर नहीं रहा है, या तो।

क्या इसका मतलब है कि मुझे वेबएपीआई रूपांतरण को छोड़ देना चाहिए? यदि नहीं, तो मुझे इन गैर-मानक तरीकों से कैसे निपटना चाहिए?

+1

'GetUsersCurrentUserCanActAsProxyFor' RESTful नहीं है, क्योंकि एक अनुरोध" वर्तमान "उपयोगकर्ता के निहित ज्ञान की जरूरत है। इसे 'GetUsersUserCanActAsProxyFor (स्ट्रिंग उपयोगकर्ता, int positionId, int appId)' में बदलें और यदि अनुरोधकर्ता अपने आप के अलावा अन्य उपयोगकर्ताओं के लिए जानकारी देखने के लिए अधिकृत नहीं है तो स्थिति 401 लौटाएं। 'GetUsersUserCanActAsProxyFor' और' GetProxyData 'दोनों GET (सुरक्षित, idempotent) के लिए आवश्यकताओं को पूरा करने लगते हैं, इसलिए यह केवल स्वाद का विषय है कि आप अपने यूआरआई कैसे डिजाइन करते हैं। – dtb

+0

स्पष्टीकरण के लिए धन्यवाद, डीटीबी। मुझे लगता है कि मैं अपने डब्ल्यूसीएफ को वेबएपीआई में अंधाधुंध रूपांतरित करने की कोशिश करने से पहले आरईएसटी प्रतिमान में और अधिक पढ़ूंगा। –

उत्तर

3

मुझे लगता है कि आप CRUD के साथ विश्वसनीय सेवाओं को भ्रमित कर रहे हैं। दोनों समान नहीं हैं, हालांकि बिंदु स्पष्ट है कि सीआरयूडी को आरईएसटी में परिवर्तित करना काफी सरल है (संसाधन और क्रिया दोनों में स्पष्ट मैपिंग है)।

एक विश्वसनीय वास्तुकला का सबसे बड़ा अंतर यह है कि यह संसाधन उन्मुख है। दूसरी बात यह है कि आप उन संसाधनों पर कार्य करने के लिए ट्रांसपोर्ट (HTTP) प्रोटोकॉल का लाभ उठाते हैं - आरईएसटी के मामले में जो पोस्ट, पोस्ट, पुट और डिलीट करते हैं।

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

/application/<id>/proxies

और उन वर्तमान उपयोगकर्ता के लिए प्रॉक्सी के रूप में कार्य कर सकते हैं:

/user/<id>/proxy-users या अपनी शैली /user/<id>/proxy/users

या कुछ इसी तरह के आधार पर। आप रिश्ते और अंतर्निहित संसाधन के बारे में सोचते हैं। कई यूआरआई एक ही संसाधन को इंगित कर सकते हैं।

नोट हालांकि कि @ डीटीबी ने अपनी टिप्पणी में उल्लेख किया है कि यूआरआई और/या (कम अधिमानतः) कुकीज़ में प्रत्येक अनुरोध में सभी आवश्यक जानकारी होती है। तो CurrentUser एक हैक का एक सा है।

के रूप में आप अपने रूपांतरण में प्रगति आप भी इस दिलचस्प पढ़ने मिल सकता है: Non-CRUD operations in a RESTful service

+0

धन्यवाद, यामेन, यह सहायक है। तो, एक "प्रॉक्सी सेवा" एंडपॉइंट होने की बजाय, मेरे पास तीन होना चाहिए: एप्लीकेशनप्रॉक्स, यूजरप्रॉक्स, और प्रॉक्सी क्रूड? –

+0

कोई भी सेवा ठीक नहीं है, बस इसे उचित तरीके से रूट करें। – yamen