我正在为客户管理系统编写RESTful服务,我正在尝试找到部分更新记录的最佳实践.例如,我希望调用者能够使用GET请求读取完整记录.但是为了更新它,只允许记录上的某些操作,比如将状态从ENABLED更改为DISABLED.(我有比这更复杂的场景)
出于安全原因,我不希望调用者仅使用更新的字段提交整个记录(这也感觉有点过分).
是否有推荐的构建URI的方法?在阅读REST书籍时,RPC样式调用似乎不受欢迎.
如果以下调用返回ID为123的客户的完整客户记录
GET /customer/123
<customer>
{lots of attributes}
<status>ENABLED</status>
{even more attributes}
</customer>
Run Code Online (Sandbox Code Playgroud)
我该如何更新状态?
POST /customer/123/status
<status>DISABLED</status>
POST /customer/123/changeStatus
DISABLED
...
Run Code Online (Sandbox Code Playgroud)
更新:增加问题.如何将"业务逻辑调用"纳入REST API?这是否有商定的方式?并非所有方法都是CRUD本质上.有些更复杂,比如' sendEmailToCustomer(123) ',' mergeCustomers(123,456) ',' countCustomers() '
POST /customer/123?cmd=sendEmail
POST /cmd/sendEmail?customerId=123
GET /customer/count
Run Code Online (Sandbox Code Playgroud)
谢谢弗兰克
在以下链接的5分钟视频中,在1:10标记处,Jon Galloway说,在他的CommentsController控制器类中添加一个名为DeleteComment的方法将按照约定自动映射到删除http动词.
如何使用WebApi的MVC知道如何将方法路由到正确的动词?我知道global.asax.cs文件中的路由将请求路由到正确的控制器,但是删除请求如何"按惯例"映射到delete方法或任何方法?特别是当每个动词可以有多于1种方法时?"按照惯例"让我觉得它只是在查看方法名称中的第一个单词...但如果是这样的话,它必须读取方法的签名来告诉两个删除方法或两个方法分开...以及是这个定义了吗?
视频:http: //www.asp.net/web-api/videos/getting-started/delete-and-update
谢谢!
编辑:以下是WebApi模板中的示例ValuesController类中的代码.这是我原来问题的来源.区分这些(以及控制器中的任何其他方法)的"约定"如何工作?
// GET /api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET /api/values/5
public string Get(int id)
{
return value;
}
Run Code Online (Sandbox Code Playgroud)