在ASP.NET MVC 2中,引入了一些新的动作过滤器属性,作为ASP.NET MVC 1中属性的"简写"; 例如,应用与HttpPostAttribute执行[AcceptVerbs(HttpVerbs.Post)]操作方法相同的操作.
此外,使用更详细的语法,可以组合不同的方法,以便例如允许Post和Delete.
现在我想知道:新属性如何工作?如果我申请两个[HttpPost]和[HttpDelete],将ASP.NET MVC 2 允许两个或需要两者(从而使没有)?
考虑REST,将HTTP方法映射到CRUD操作相对容易:用于创建的POST,用于读取的GET等等.但是"即发即弃"操作呢?什么HTTP方法最能代表火灾和忘记操作,例如触发批处理作业(没有响应发送回调用者)?
POST会浮现在脑海中,但我认为GET也是一种合适的方法,因为99%的时候你只为这些类型的动作提供了一堆参数.你怎么看?
我正在使用Azure网站构建一个简单的PHP Web服务,我无法使其支持PUT和DELETE http方法.假设它必须进入web.config文件 - 我尝试了几个来自互联网的选项,但它们似乎没有正常运行.有任何想法吗?
这是目前的web.config文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
</handlers>
<security>
</security>
<directoryBrowse enabled="false" />
<caching>
<profiles>
<add extension=".php" policy="DontCache" kernelCachePolicy="DontCache" />
<add extension=".html" policy="CacheForTimePeriod" kernelCachePolicy="CacheForTimePeriod" duration="14:00:00" />
</profiles>
</caching>
<rewrite>
<rules>
<rule name="block favicon" stopProcessing="true">
<match url="favicon\.ico" />
<action type="CustomResponse" statusCode="404" subStatusCode="1"
statusReason="The requested file favicon.ico was not found"
statusDescription="The requested file favicon.ico was not found" />
</rule>
<rule name="Cols Rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
<add input="{URL}" pattern="^/favicon.ico$" …Run Code Online (Sandbox Code Playgroud) 我有一个动作列表
//[HttpGet] (will come back to that!)
public ViewResult List(int page = 1)
{
//blah blah blah
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
在它的视图中我们渲染动作:
@{
Html.RenderAction("UpdateSearch");
}
Run Code Online (Sandbox Code Playgroud)
行动定义:
[ChildActionOnly]
[HttpGet]
public PartialViewResult UpdateSearch()
{
// do something and display a form in view
return PartialView(so);
}
[HttpPost]
public RedirectToRouteResult UpdateSearch(Options searchOptions)
{
// do something and redirect to List
return RedirectToAction("List");
}
Run Code Online (Sandbox Code Playgroud)
而且我得到:每当有人提交表单时,不允许子操作执行重定向操作异常.我是MVC3的新手,但看起来重定向也是一个POST,因为如果[HttpGet]上面的List方法被取消注释"无法找到资源".
如何在重定向时更改Http方法或者我做错了什么?我确实试过Bing,但没有成功.
我正在使用HttpClient,我需要设置非标准类型HttpMethod.如果使用HttpWebRequest只需要一个字符串,那么HttpClient期望一个HttpMethod.枚举可用值HttpMethod,我没有看到添加自定义值的方法.有什么想法吗?
据我了解,PUT 请求发送整个对象,而 PATCH 请求只发送差异,差异用于更新数据库中的对象。
为什么要在 PATCH 上执行 PUT?PATCH 似乎要轻得多。我看不到 PUT 的任何好处(我确定它们存在,我只是不知道它们是什么)。
PUT 方法怎么可能是幂等的但不安全?有人可以解释一下吗?
HTTP Method Idempotent Safe
OPTIONS yes yes
GET yes yes
HEAD yes yes
PUT yes no
POST no no
DELETE yes no
PATCH no no
Run Code Online (Sandbox Code Playgroud) 我有一个资源Car,其中有一些必填字段和另一个可选字段。
它Car是根据以下请求创建的:
POST /cars
{
plate: "XYZ-A2C4",
color: "blue,
owner: "John" //OPTIONAL
}
Run Code Online (Sandbox Code Playgroud)
REST 客户端想要更新这辆车的所有必需信息:
PUT /cars/:id
{
plate: "ABC-1234",
color: "black"
}
Run Code Online (Sandbox Code Playgroud)
可选字段会发生什么情况owner?
PUT 必须用有效负载中传递的表示替换整个资源? owner不需要,服务器可以保留旧值?
我知道服务器可以提供一种PATCH方法,但有时无法更新单个字段,因为新状态可能会变得无效(没有强制执行相关字段值所需的最低有效负载)。此外,在某些情况下,操作数组、删除字段或设置它null可能会很棘手,PATCH因为它可以使用两种不同的模式来完成;JSON Merge Patch 是有限的,并且 JSON Patch有点奇怪。
是否可以使用PUT必填字段执行 a 并且服务器在省略该字段时保留旧的可选值?
我很惊讶地发现网上很少提到这个困境,这让我想知道我是否完全错过了一些东西。
假设我有一个名为 的单例资源Settings。它是在我的 Web 服务器的 init/install 上创建的,但某些用户可以通过 REST API 修改它,比如说/settings我的 URI。我有一项GET检索设置(作为 JSON)的操作,以及一项PATCH设置一个或多个值的操作。
现在,我想让用户在完成任何调用之前将此资源(或者可能是它的各个属性)重置为默认值 - 默认值是“init 上使用的任何值” PATCH。我似乎找不到任何“最佳实践”方法,但以下是我提出的方法:
DELETE对资源使用操作。毕竟它是幂等的,而且(对我来说)非常清楚。但由于 URI 之后仍然存在DELETE,这意味着资源既没有被删除也没有移动到不可访问的位置,这与 的 RESTful 定义相矛盾DELETE。POST用于专用端点,例如/settings/reset- 我真的不喜欢这个,因为它是最明显的非 RESTful,因为动词位于 URI 中PATCH操作,传递一些“默认”的替代值,例如null值。我遇到的问题是操作的结果与输入不同(我将一个属性设置为null,然后我得到它,它有一个字符串值)GET,例如/setings/defaults,然后使用 a 中的响应PATCH设置为这些值。这似乎与 REST 没有任何矛盾,但它确实需要 2 个 API 调用才能完成看似简单的操作。如果上述其中一项被认为是最佳实践,或者如果我没有在上面列出其中一项,我很想听听。
编辑:
我的具体项目有一些属性可以简化这个问题,但我最初没有提到它们,因为我的目的是让这个线程作为将来尝试解决相同问题的任何人的参考。我想确保这个讨论足够通用,对其他人有用,但又足够具体,对我也有用。为此,我将附加以下内容。
就我而言,我正在为现有产品设计 API。它有一个面向普通用户的 Web 界面,还有一个 REST(ish)API,旨在满足需要使用所述产品自动执行某些任务的开发人员的 …
在过去的两天里,我收到了几个警报,因为我们的服务在很大一部分请求中响应了 5xx(通常是在下班时间,当我们的流量为零到低时)。
\n当我检查应用程序日志时,我发现了这两个;
\nIllegal request, responding with status \xe2\x80\x98501 Not Implemented\xe2\x80\x99: Unsupported HTTP method: MOZILLAVT\n\nIllegal request, responding with status \xe2\x80\x98501 Not Implemented\xe2\x80\x99: Unsupported HTTP method: VTTEST\nRun Code Online (Sandbox Code Playgroud)\n知道这些是什么以及哪些工具产生它们吗?谷歌没有帮助。
\n很明显,我们的网站正在接受某种漏洞测试,因为我看到了 nginx 访问日志,但这些请求不存在,这更奇怪。
\nhttp-method ×10
http ×4
rest ×4
c# ×2
api-design ×1
architecture ×1
azure ×1
idempotent ×1
java ×1
put ×1
redirect ×1
web-config ×1