jcv*_*dan 6 .net c# asp.net-web-api
我有一个控制器,Groups其中包含以下操作:
public GroupModel Get(int ID)
public GroupModel Post(CreateGroupModel model)
public void Put(PublicUpdateGroupModel model)
public void PutAddContacts(UpdateContactsModel model)
public void PutRemoveContacts(UpdateContactsModel model)
public void Delete(int ID)
Run Code Online (Sandbox Code Playgroud)
我想做的是使用标准的REST路由来调用标准的get,post,put,delete mehods.但拨打PutAddContacts和PutRemoveContacts如果动作名称添加到URL,例如:
获取组/ - 调用Get方法
POST组/ - 调用Post方法
PUT组/ - 调用Put方法
DELETE groups/ - 调用Delete方法
PUT groups/addcontacts - 调用PutAddContacts方法
PUT groups/removecontacts - 调用PutRemoveContacts方法
是否可以设置路由来执行此操作,或者如果我想在URL中使用操作名称,是否需要沿着RPC路由进行路由?
EBa*_*arr 12
你现在拥有的如何
利用上面的方法,你需要去RPC.这是因为你的例子已经完成了RPC的做事方式.默认的WebAPI路由鼓励RESTful设置,但如果您对路由进行了微小的更改,一切都将开始工作.例如,您可以将默认路由更改为典型的MVC路由:
routes.MapRoute( name : "Default",
url : "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional });
Run Code Online (Sandbox Code Playgroud)
添加路由后,以典型的MVC方式调用您使用控制器名称和操作的内容.但是,从你的问题来看,我怀疑你确实想要成为RESTful,而不仅仅是让它工作所以请继续阅读......
RESTful
REST 不需要HTTP,尽管这两者经常在一起讨论.REST实际上是关于具有语义准确表示的每个资源.使用HTTP时,这意味着尊重HTTP语义的唯一URI.因此,例如,使用HTTP GET的调用永远不应该修改数据,因为这违反了HTTP的GET定义和混淆HTTP基础设施(如缓存).
POST/PUT与MERGE/PATCH
我们都熟悉GET,POST,PUT,HEAD等作为HTTP方法.通常,GET用于检索,POST用于添加,PUT用于修改(尽管存在很多争议).但是,您有两种类型的修改:添加项目和从集合中删除项目.PUT还是别的什么呢?社区还没有完全确定如何做到这一点.
选项1:自定义媒体类型 - HTTP规范确实允许所有排序方法,它是真正限制我们熟悉的子集的浏览器.因此,您可以创建MERGE(Roy Fielding解决方法)或PATCH(oData work around)方法,并定义此新媒体类型的行为 - 可能是一个用于添加,另一个用于删除.
选项2:使用POST/PUT - 使用PUT添加和删除联系人.只需将ID列表视为切换(如果存在则删除,如果缺少添加)或者altatley包含足够的信息以了解要执行的操作.然后返回HTTP 303,指示客户端它具有陈旧状态并刷新.
选项3:完整列表 - 如果您的设置大小合理,则每次要更新时都可以传递完整的联系人列表.这种逻辑是一种超级简单的擦除和替换.
从RESTful角度来看,真正重要的是您的应用程序在所有方法中以一致的方式运行.因此,如果MERGE意味着添加,它应该始终意味着添加.如果您希望将一组完整的ID传递给PUT,那么总是传递一套完整的ID.
控制器设计
如果是我,我会将你的控制器分成多个控制器.一个控制器处理组另一个交易联系人(作为一个组),第三个处理一个组内的一个联系人.就像是 ...
//api/Group/
public List<GroupModel> Get()
public GroupModel Get(int ID)
public GroupModel Post(GroupModel model) //add a group
public GroupModel Put(GroupModel model) //update a group (see comments above)
public void Delete(int ID)
//api/GroupContacts/
public ContactsModel Get() //gets complete list
public void PostContacts(ContactsModel model) //pushes a COMPLETE new state
public void Delete() //delete entire group of contacts
//api/GroupContact/354/
public ContactModel Get(int id) //get contact id #354
public void PostContact(ContactModel model) //add contact (overwrite if exits)
public void Delete(int id) //delete contact if exists
Run Code Online (Sandbox Code Playgroud)
如果您希望您的URL显示为嵌套(例如:/api/Group/Contacts,/api/Group/Contact),您可以查看我写的其他帖子.恕我直言,asp.net的路由需要调整以支持嵌套更容易......但这是一个不同的问题;-)
| 归档时间: |
|
| 查看次数: |
9667 次 |
| 最近记录: |