2012-05-02 59 views
7

我正在通過將現有的WCF服務轉換爲WebAPI來學習WebAPI(以及一般的REST)。在這個過程中,我對處理非CRUD操作的最佳方式感到困惑。這裏是我的服務合同:RESTful(WebAPI)服務中的非CRUD操作

[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 - 代理系統所使用的多個應用程序,雖然我能做的API /代理/ 1,我覺得的「欺騙」,因爲這應該是越來越ProxyId 1,而不是應用程序1的代理。

GetUsersCurrentUserCanActAsProxyFor - 這是一個讓我困惑的多層次。我應該如何處理多個參數?它也不會完全落入CRUD方法中。

這是否意味着我應該放棄WebAPI轉換?如果不是,我應該如何處理這些非標準方法?

+1

'GetUsersCurrentUserCanActAsProxyFor'是不是平安,因爲請求需要的「當前」用戶的隱性知識。將其更改爲'GetUsersUserCanActAsProxyFor(string user,int positionId,int appId)',並且如果請求者未被授權查看除自己以外的用戶的信息,則返回狀態401。 'GetUsersUserCanActAsProxyFor'和'GetProxyData'似乎都符合GET(安全,冪等)的要求,所以這只是你如何設計你的URI的品味問題。 – dtb

+0

謝謝澄清,dtb。在我進一步試圖盲目地將我的WCF轉換爲WebAPI之前,我想我會更多地閱讀REST範例。 –

回答

3

我認爲你會將RESTful服務與CRUD混淆。這兩者並不相同,不過要清楚的是,將CRUD轉換爲REST非常簡單(資源和動詞都有明確的映射)。

RESTful體系結構最大的區別在於它是面向資源的。第二種方法是利用傳輸(HTTP)協議來處理這些資源 - 對於REST(GET,POST,PUT和DELETE)。

轉到您的示例,似乎您最大的麻煩在於決定使用URI方案來支持此服務。我可以建議,對於分層信息,這應該是直截了當的。例如,應用程序代理:

/application/<id>/proxies

而且用戶當前用戶可以作爲代理行事:

/user/<id>/proxy-users,或者根據您的風格/user/<id>/proxy/users

或類似的東西。你想到了這種關係和潛在的資源。許多URI可以指向相同的資源。

請注意,儘管@dtb在他的評論中提到了URI和/或(不太可取的)cookie,它包含了每個請求中所有需要的信息。所以CurrentUser是一個黑客。

您也可能會發現這個有趣的閱讀,你在你的轉換進度:Non-CRUD operations in a RESTful service

+0

謝謝,衙門,這很有幫助。因此,我不應該有一個「Proxy Service」端點,而應該有三個:ApplicationProxies,UserProxies和ProxyCrud? –

+0

沒有人服務是好的,只是適當的路線。 – yamen