通常,当您在 IIS 上托管您的网站(我在这里假设为 ASP .Net MVC)时,您发送到服务器端的请求将主要分为两类 http 动词,即GET
or POST
。看看下面提到的 ASP .NET MVC 代码。在控制器级别,可以使用任何 http 动词来装饰我们的操作:
现在让我们首先了解如果我们使用的是普通的 ASP .NET MVC 框架(没有任何 java 脚本),那么为什么每个请求只分为两类GET
,即POST
.
假设我的网站中有一个视图(也称为网页),它负责注册访问我网站的新用户。您将看到控制器代码如下:
namespace MvcTestApp.Controllers
{
// GET: /Account/Register
[HttpGet]
public ActionResult Register()
{
return View();
}
//
// POST: /Account/Register
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
WebSecurity.Login(model.UserName, model.Password);
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
}
}
您在浏览器的地址栏中键入http://localhost:9896/Account/Register/
url,以便在浏览器中加载注册视图/网页。这就像对网页的第一次请求,所以当您HttpGet
第一次获取网页时,您的浏览器会自动将其默认为动词。所以在这种情况下,下面用[HttpGet]
动词注释的方法被调用:
[HttpGet]
public ActionResult Register()
{
return View();
}
现在,在页面上,我有一个按钮,一旦我提供了与注册相关的所有详细信息,我单击该按钮以启动注册过程。如果您查看网页的源代码,您会看到下面的按钮 html 代码:
<input type="submit" value="Register" />
每当您单击 HTML 类型的控件时,submit
它的简单工作就是将当前页面的更新内容发布/提交到服务器。任何 html 控件input
,包括发出服务器端请求的 html 控件,都只能HttpPost
通过浏览器发出动词请求。由于它是httpPost
对服务器的动词请求,请求完全相同的 URL,因此下面提到的用HttpPost
get 修饰的方法被调用。ASP.Net 运行时从客户端请求中获取此信息,它实际上是一个 http POST 请求,因此决定在具有[HttpPost]
注释的控制器上调用以下方法:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
.....
.....
}
因此,只要您没有在视图/网页上使用任何 javascript,您最终就会发出 http get(首次)请求或 http post(使用 html 提交控件)请求。
在 CRUD 操作中,创建和更新/修改操作由使用[HttpPost]
.
当满足以下两个条件时,HTTP put 动词用于创建/替换资源:
- 端点必须是幂等的:一遍又一遍地重做请求是安全的。
- URI 必须是要更新的资源的地址。
您可以在此处阅读有关 put vs post 的更多信息。
因此,如果您在服务器端的业务场景能够管理与 HTTP put 动词相关的约束,那么 ASP.NET MVC 对此有规定。[HttpPut]
您可以在控制器内创建一个动作,并使用浏览器中的 http put 动词对其进行装饰和调用。
好吧,即使在某些情况下您碰巧满足 put 动词规定的标准,那么您也无法使用 HTTP 提交按钮调用它。您将不得不求助于 java 脚本 XMLHttpRequest(即 AJAX 调用)来进行 put 动词调用,如下所示:
$.ajax({
url: '/Account/Register',
type: 'PUT',
success: function(result) {
// Do something with the result
}
});
此外,围绕http delete 动词的使用,我看到人们明确地在MVC 控制器上定义了一个动作,例如void DeleteUser(int userId)
使用http POST 动词调用。
所以总而言之,我们可以看到对于 http PUT、POST 和 DELETE 动词,我们只有在服务器端使用 http POST 动词调用的动作/方法。在通常的业务应用程序中,我从未想过用[HttpPut]
or来装饰我的 MVC 操作[HttpDelete]
。
希望这可以帮助你得到一些澄清。