2012-05-02 36 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