[英]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.