限制每个操作的可用HTTP谓词是一个好习惯吗?我的代码是不带清洁剂[HttpGet],[HttpPost],[HttpPut],或[HttpDelete]装饰的每一个动作,但它也可能是不太可靠的或安全.我没有在许多教程或示例代码中看到这一点,除非明确要求动词,比如有两个"创建"动作,其中GET版本返回一个新表单,POST版本插入一个新记录.
我似乎无法OPTIONS在我的IIS6托管的ASP.NET应用程序中接收HTTP 请求.我在我Global.asax的Application_BeginRequest方法中使用调试断点(和文件日志)测试它.断点永远不会被命中,客户端获取HTTP 403 Forbidden,我从IIS6直接假设(GETs和POSTs工作正常顺便说一句).
我试着在几个方面web.config,包括添加以下行要么两者的<system.webServer><handlers>和<system.web><httpHandlers>部分.
<add name="OptionsHandler" verb="OPTIONS" path="*" type="System.Web.DefaultHttpHandler"/>
Run Code Online (Sandbox Code Playgroud)
我也玩过<system.webServer><security><requestFiltering><verbs>设置allowUnlisted="true"和<add verb="OPTIONS" allowed="true"/>.
此外,我没有使用URLScan或任何其他可能拦截调用的工具.如果您对IISLogs感兴趣:
2011-07-11 20:26:05 W3SVC1215124377 127.0.0.1 OPTIONS /test.aspx - 80 - 127.0.0.1 Mozilla/5.0+(Windows+NT+5.2;+rv:5.0)+Gecko/20100101+Firefox/5.0 403 1 0
Run Code Online (Sandbox Code Playgroud)
有没有办法OPTIONS在ASP.NET应用程序中接收请求?
在ASP.NET MVC中,您可以使用AcceptVerbs属性将视图函数与动词相关联:
public ActionResult Create()
{
// do get stuff
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
// do post stuff
}
Run Code Online (Sandbox Code Playgroud)
Django Book建议如下:
def method_splitter(request, *args, **kwargs):
get_view = kwargs.pop('GET', None)
post_view = kwargs.pop('POST', None)
if request.method == 'GET' and get_view is not None:
return get_view(request, *args, **kwargs)
elif request.method == 'POST' and post_view is not None:
return post_view(request, *args, **kwargs)
raise Http404
Run Code Online (Sandbox Code Playgroud)
urls.py:
urlpatterns = patterns('',
# ...
(r'^somepage/$', views.method_splitter, {'GET': views.some_page_get,
'POST': views.some_page_post}),
# ...
) …Run Code Online (Sandbox Code Playgroud) 我有两个链接:
<%= link_to("Edit", edit_product_path(product.id)) %>
<%= link_to("Delete", product, :method => :delete) %>
Run Code Online (Sandbox Code Playgroud)
生成的链接是:
<a href="/products/81/edit">Edit</a>
<a href="/products/81" data-method="delete" rel="nofollow">Delete</a>
Run Code Online (Sandbox Code Playgroud)
单击同时打开Edit和打开时Delete,将GET使用该方法.
Rails如何决定使用哪种方法?
链接中的含义data-method="delete"和rel="nofollow"含义是什么Delete?
ruby-on-rails http-verbs http-method link-to ruby-on-rails-3
大多数时候,网站主要只使用GET和POST所有操作,但还有七个动词.他们在旧时代使用过的地方,但现在却没有那么多?
或许是因为某些浏览器无法识别其他动词?如果是这种情况,为什么浏览器供应商会选择实施一半的协议?
[更新]
我发现这篇文章对这种情况做了很好的总结:为什么REST失败了.
我通过AJAX和Delete动词方法进行调用,但IIS服务器的响应是405 Method Not Allowed.
我读过它.显然一切都好,我没有安装webDAV.我试图定义处理程序,模块等......我无法获得成功!
这是详细的错误信息:
模块StaticFileModule
通知ExecuteRequestHandler
处理程序StaticFile
错误代码0x80070001
有人也得到这个错误吗?关于它的任何亮点?
是否可以将AJAX PATCH请求设置为laravel,或者我是否仅限于POST?Laravel在输入隐藏字段中使用PATCH,但是,我没有使用表单元素 - 只是在单击时(通过AJAX请求)部分更新记录的按钮.
这条路线怎么样?
路由文件
Route::patch('questions/{id}', 'QuestionController@update')->before('admin');
我不确定laravel路由是否支持PATCH.
调节器
public function update($id) {
if (Request::ajax() && Request::isMethod('patch')) {
//partially update record here
}
}
Run Code Online (Sandbox Code Playgroud)
JS
$('div#question_preview <some button selector>').click(function (event) {
$.ajax({
url: 'questions/'+question_id,
type: 'PATCH',
data: {status: 'some status'}
});
});
Run Code Online (Sandbox Code Playgroud)
我只是想寻求清晰,谢谢!
我是这个游戏的新手,所以我可能会误解事物.实际上,如果有人告诉我,我误解了事情,那将是一种恩惠.也许这个人会体贴到足以向我展示正确的道路.但...
REST适用于Web服务(http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services)的" 指南 "或" 最佳实践 "之一是,您应该在拨打电话时使用正确的HTTP方法(我误解了它?)REST API的.
但是看看Web上的许多API实现,我看到100%的调用实际上是GET调用,根据它们的URI,它将被API解释为HTTP动词或方法之一.
因此,例如,查看Twitter(https://dev.twitter.com/rest/public)的REST API文档,其原则上只定义了两个动词/方法(GET和POST),实际上已发送所有调用作为GET,并且基于GET调用中的URI,由API解释并采取行动.
例:
GET状态/查找:https://api.twitter.com/1.1/statuses/lookup.json
POST状态/更新(PUT?):https://api.twitter.com/1.1/statuses/update.json
在这两种情况下,调用本身都是使用GET进行的,URI的最后一部分将其定义为真正的GET或POST.
总之,要成为真正的REST,不应该为Web服务的REST API的客户端实现使用正确的HTTP谓词/方法吗?
我错过了什么?
如何在应用程序启动时检测到客户端不支持DELETE和PUT动词并自动重载POST动词?
在服务器端,如何将那些重载的POST动词重定向到正确的动作?
假设我有一个覆盖的DELETE请求,如何调用控制器中与该操作匹配的相应函数?
我的猜测是我应该使用一些动作过滤器并使用反射来检查与我的函数匹配的属性(在这个例子中:) DeleteFoo(Guid Id).
rest asp.net-mvc http-verbs action-filter actionfilterattribute
在评估表单已提交时,我检查该方法是否发布,而不是获取.我被告知这是一个很好的方式,通过单击提交按钮知道表单已提交,并且它不仅仅是通过在URL中传递数据的脚本提交的.
怎么样的"放"方法.它看起来非常类似于"帖子".是否可以或多或少地使用而不是"邮寄"而不会损失"邮寄"所带来的好处?
http-verbs ×10
asp.net-mvc ×3
rest ×3
http-method ×2
iis ×2
ajax ×1
api ×1
asp.net ×1
browser ×1
django ×1
django-views ×1
forms ×1
http ×1
iis-6 ×1
laravel ×1
link-to ×1
php ×1
post ×1
protocols ×1
security ×1