C# RESTful(WebAPI)服务中的非CRUD操作
通过将现有的WCF服务转换为WebAPI,我正在学习WebAPI(以及一般的REST)。在这个过程中,我对处理非积垢操作的最佳方法感到困惑。这是我的服务合同:C# RESTful(WebAPI)服务中的非CRUD操作,c#,asp.net,wcf,asp.net-web-api,C#,Asp.net,Wcf,Asp.net Web Api,通过将现有的WCF服务转换为WebAPI,我正在学习WebAPI(以及一般的REST)。在这个过程中,我对处理非积垢操作的最佳方法感到困惑。这是我的服务合同: [ServiceContract] public interface IProxyHelper { [OperationContract] List<ProxyInfo> GetUsersCurrentUserCanActAsProxyFor(int positionId, int appId); [
[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);
}
[服务合同]
公共接口IProxyHelper
{
[经营合同]
列出GetUsersCurrentUserCanActAsProxyFor(int-positionId,int-appId);
[经营合同]
无效删除代理(int-id);
[经营合同]
列出GetProxyData(int-appId);
[经营合同]
bool-CanPositionProxy(int-positionId,int-appId);
[经营合同]
无效添加代理(
字符串userRacf,
字符串proxyAsRacf,
int userPositionId,
int proxyPositionId,
由ACF请求的字符串,
int-appId);
[经营合同]
int GetPositionIdByRacf(字符串racf);
[经营合同]
字符串GetRacfByPositionId(int-positionId);
}
有些方法,如DeleteProxy和AddProxy I,可以很容易地转移到基于CRUD的方法
问题围绕着:
GetProxyData-代理系统由多个应用程序使用,虽然我可以使用api/proxy/1,但我觉得这是“欺骗”,因为这应该是为了获取ProxyId 1,而不是应用程序1的代理
GetUsersCurrentUserCanActAsProxyFor——这一个在多个层面上对我来说都很混乱。我应该如何处理多个参数?而且它也不完全属于CRUD方法
这是否意味着我应该放弃WebAPI转换?如果没有,我应该如何处理这些非标准方法?我认为您将RESTful服务与CRUD混淆了。这两者并不相同,尽管将CRUD转换为REST非常简单(资源和动词都有一个清晰的映射) RESTful体系结构的最大区别在于它是面向资源的。第二个是利用传输(HTTPs)协议对这些资源进行操作——对于REST,就是GET、POST、PUT和DELETE 转到您的示例,您最大的问题似乎是决定使用URI方案来支持此服务。我可以建议,对于分层信息,这应该是直接的。例如,应用程序代理:
/application//代理
并且当前用户可以作为以下各项的代理:
/user//proxy users
或根据您的风格/user//proxy/users
或者类似的东西。你要考虑关系和潜在资源。许多URI可以指向同一资源
请注意,正如@dtb在其评论中提到的,URI和/或(不太可取)cookie在每个请求中都包含所有需要的信息。所以CurrentUser
有点像黑客
在转换过程中,您可能还会发现以下有趣的信息:
GetUsersCurrentUserCanActAsProxyFor
不是RESTful,因为请求需要隐式了解“当前”用户。将其更改为getUserSuserCanatsProxyFor(字符串用户,int-positionId,int-appId)
,如果请求者没有权限查看除他自己以外的用户的信息,则返回状态401。GetUsersUserCanActAsProxyFor
和GetProxyData
似乎都符合GET(安全、幂等)的要求,因此如何设计URI只是一个品味问题。感谢您的澄清,dtb。在我进一步尝试将我的WCF转换为WebAPI之前,我想我会对REST范例做更多的阅读。谢谢,yamen,这很有帮助。因此,我不应该有一个“代理服务”端点,而应该有三个:ApplicationProxies、UserProxies和ProxyCrud?没有一个服务是好的,只需要适当地路由到它。