Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该在帖子或url中存储_method=PUT/DELETE吗_C#_Asp.net Mvc_Http_Rest - Fatal编程技术网

C# 我应该在帖子或url中存储_method=PUT/DELETE吗

C# 我应该在帖子或url中存储_method=PUT/DELETE吗,c#,asp.net-mvc,http,rest,C#,Asp.net Mvc,Http,Rest,我正在使用ASP.NETMVC来构建一个RESTful web应用程序,我计划通过POST来隧道PUT和DELETE请求,因为这似乎是最实用的解决方法 我想知道的是,我是否应该像下面这样通过url传输信息: <form method='post' action='resource?_method=DELETE'> <!-- fields --> </form> <form method='post' action='resource'>

我正在使用ASP.NETMVC来构建一个RESTful web应用程序,我计划通过POST来隧道PUT和DELETE请求,因为这似乎是最实用的解决方法

我想知道的是,我是否应该像下面这样通过url传输信息:

<form method='post' action='resource?_method=DELETE'>
    <!-- fields -->
</form>
<form method='post' action='resource'>
    <input type='hidden' name='_method' value='DELETE' />
    <!-- fields -->
</form>

或者我应该像这样通过发布的表单数据进行隧道传输:

<form method='post' action='resource?_method=DELETE'>
    <!-- fields -->
</form>
<form method='post' action='resource'>
    <input type='hidden' name='_method' value='DELETE' />
    <!-- fields -->
</form>

每种方法的优点和缺点是什么

编辑:我问这个问题的原因之一是,我在某个地方读到,将这样的信息放在url中是一件好事,因为帖子数据通常会丢失,但url会挂起(在日志文件等中)-不幸的是,这会使url看起来很难看

它们是等价的


虽然如果被追问,我更愿意自己邮寄,但这是主观的。

你看到这个问题了吗?据我所知,x-http-method-override标头是解决此问题的首选解决方案。

我没有,但您不应该使用:

<form method="put" action="resource">
    <!-- fields -->
</form>

和/或

<form method="delete" action="resource">
    <!-- fields -->
</form>


…?

更多的是个人偏好。RESTfulWeb服务,或者说,在某种程度上可以互换地描述两者

也就是说,出于程序员的意图,我更喜欢第一种方法。在Rest中,当我看代码时,我会在心里阅读

动词

动词和资源靠得很近

使用PUT和DELETE时,您必须使用类似于所示的解决方法。在第一个示例中,资源和动词仍然在同一行上靠得很近


但是,在第二个示例中,资源被分成两行。谓词包含在与资源id相同的行中,但与资源名称不同。这非常非常小,但对我来说,这使得第二个示例的可读性降低。

x-http-method-override是否可以从禁用javascript的浏览器中使用?我不知道在不启用javascript的情况下如何实现。我很乐意,但我看到的大多数web浏览器(以及HTML/XHTML规范)都不支持这一点。就我个人而言,我会把它放在帖子里,因为这是请求的所有其他信息所在。你在哪里读到过在URL中更好?我不记得了,但很好的一点是,像URL这样的东西都被记录下来了。如果我检查我的请求日志,我可以看到“POST/resource?”\u method=DELETE”,而不仅仅是“POST/resource”,GET请求永远不会修改数据。千万不要将_方法放在queryparam中,因为它允许URL将GET请求更改为不同的请求动词。假设我向您的用户发送了一封电子邮件,其中有一个链接“单击此处获取免费小狗”,但该链接实际上是通过路径“/message/delete/1?\u method=delete”进入您的网站的。当一些用户不可避免地点击它时,你认为会发生什么?这也是我得出的结论,所以我把它标记为公认的答案。从HTTP的角度来看,数据包的第一行应该有动词和要访问的资源。把它放在url中比把它隐藏在帖子信息中更接近这个理想。用户无论如何都不会真正看到url,因为成功的PUT可以重定向以获取相关资源。我不建议在url中添加动词,因为它用于资源标识,而不是操作标识。在我看来,隐藏输入或方法重写头是更好的解决方案。另一种可能的解决方案是使用纯HTML将MIME类型参数添加到表单的enctype中。