繁体   English   中英

RESTful(WebAPI)服务中的非CRUD操作

[英]Non-CRUD Operations in a RESTful (WebAPI) Service

我正在通过将现有的WCF服务转换为WebAPI来学习WebAPI(通常是REST)。 在此过程中,我对处理非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 / Proxy / 1,但我认为这是“作弊”,因为那应该用于获取ProxyId 1,而不是应用程序1的代理。

GetUsersCurrentUserCanActAsProxyFor-这对我来说在多个级别上令人困惑。 我应该如何处理多个参数? 而且,它也不是完全落入CRUD方法中。

这是否意味着我应该放弃WebAPI转换? 如果没有,我应该如何处理这些非标准方法?

我认为您将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和/或(不太理想)cookies在每个请求中都包含所有需要的信息。 因此, CurrentUser有点骇人听闻。

随着转换的进行,您可能还会发现以下有趣的读物: RESTful服务中的非CRUD操作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM