在有人说“重复”之前,我已经查看了其他类似标题的问题而没有回答我的具体问题,所以请继续阅读!
我是一个完整的Web开发新手,但已经开始研究非常基本的HTTP和HTML。我的背景是RPC / SOAP风格的服务和桌面应用程序。问题是我对基本级别的HTTP本身非常困惑,特别是POST,PUT和DELETE动词。
我可以理解GET用于从Web服务器请求页面,但我不明白当您实际执行其他三个动词操作时会发生什么。如果您是在Apache或IIS上托管网页,并且您有一个带有提交按钮的Web表单,可能会发送一个包含您在表单中填写的数据的POST ...但是Web服务器做了什么这个?网页如何使用PUT和DELETE? PUT是什么?删除什么?它不像你在服务上调用某种方法,然后对数据库执行操作。我假设像ASP.NET这样的框架在这里发挥作用,但在vanilla HTTP / HTML中,我只是不知道它是如何组合在一起的......
我真的完全错过了一些东西......帮助赞赏!
答案 0 :(得分:0)
您的问题都在RFC 2616中得到了解答,其中概述了服务器应如何对POST
,PUT
,DELETE
方法做出反应。每种方法(包括此处未提及的方法)都有自己的要求和建议。如果查看HTTP请求的raw text stream,您会注意到通过线路发送的第一个数据是HTTP动词。至于如何在服务器端实现这些方法,这完全取决于您正在编程的环境。例如,如果您使用PHP实现您的站点,您可以使用$_SERVER['REQUEST_METHOD']
来确定应该如何处理请求。
答案 1 :(得分:0)
通常当您在IIS上托管您的网站(我在这里假设ASP .Net MVC)时,您到服务器端的请求将主要分为两类http动词,即GET
或{{1} }。看看下面提到的ASP .NET MVC代码。在控制器级别,可以使用任何http动词来装饰我们的动作:
现在让我们首先了解我们是否使用普通的ASP .NET MVC框架(没有任何java脚本),然后为什么每个请求只分为两个类别,即POST
和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/
动词。所以在这种情况下,下面用HttpGet
动词注释的方法被调用:
[HttpGet]
现在,在页面上,我提供了一个按钮,一旦我提供了与注册相关的所有详细信息,我就会单击该按钮来启动注册过程。如果您查看网页的来源,那么您会看到以下按钮的html代码:
[HttpGet]
public ActionResult Register()
{
return View();
}
每当您单击类型为<input type="submit" value="Register" />
的HTML控件时,其简单的工作就是将当前页面的更新内容发布/提交给服务器。任何包含submit
html控件的html控件都会产生服务器端请求,只能通过浏览器发出input
个动词请求。由于对服务器的HttpPost
动词请求是完全相同的URL,因此下面提到的用httpPost
修饰的方法被调用。 ASP.Net运行时从客户端请求中获取此信息,它实际上是一个http POST请求,因此决定在具有HttpPost
注释的控制器上调用以下方法:
[HttpPost]
因此,只要您不在视图/网页上使用任何JavaScript,您最终会发出http get(首次)请求或http post(使用html submit controls)请求。
在CRUD操作之外,创建和更新/修改操作由使用[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
.....
.....
}
注释的相同方法处理。
HTTP put动词用于在满足以下两个条件时创建/替换资源:
您可以阅读有关put vs post here的更多信息。
因此,如果您在服务器端的业务场景将能够管理与HTTP put动词相关的约束,那么ASP.NET MVC就有这样的规定。您可以在控制器内创建一个动作,并使用[HttpPost]
进行装饰,然后使用浏览器中的http put动词调用它。
好吧,即使在某些情况下,您碰巧满足put动词规定的标准,那么您也无法使用HTTP提交按钮调用它。您将不得不求助于java脚本XMLHttpRequest(即AJAX调用)来进行动词调用,如下所示:
[HttpPut]
此外,围绕http删除动词的使用,我看到人们明确地在MVC控制器上定义了一个动作,例如{http:1}}使用http POST动词调用。
总而言之,我们可以看到,对于http PUT,POST和DELETE谓词,我们在服务器端只有使用http POST动词调用的动作/方法。在常见的业务应用程序中,我没有想到用$.ajax({
url: '/Account/Register',
type: 'PUT',
success: function(result) {
// Do something with the result
}
});
或void DeleteUser(int userId)
来装饰我的MVC操作。
希望这有助于您获得一些澄清。
答案 2 :(得分:-2)
PUT和DELETE请求在大多数标准Web服务器上根本不做任何事情 - 它们只会吐回HTTP 405(不支持的方法)错误。如果不使用Javascript,也无法从网页触发它们。
就PUT和DELETE的含义而言,这完全取决于应用程序。然而,PUT习惯于尝试在请求的URL处创建实体,并且DELETE删除所请求的元素。 (例如,在RESTful wiki中,PUT会创建一个页面,POST或PATCH将用于编辑页面,DELETE会删除它。)实际上,这些方法并不常用,因为它通常更容易超载GET和POST。