HTTP动词POST,PUT,DELETE:这些被“处理”的位置

时间:2012-07-04 01:07:21

标签: http

在有人说“重复”之前,我已经查看了其他类似标题的问题而没有回答我的具体问题,所以请继续阅读!

我是一个完整的Web开发新手,但已经开始研究非常基本的HTTP和HTML。我的背景是RPC / SOAP风格的服务和桌面应用程序。问题是我对基本级别的HTTP本身非常困惑,特别是POST,PUT和DELETE动词。

我可以理解GET用于从Web服务器请求页面,但我不明白当您实际执行其他三个动词操作时会发生什么。如果您是在Apache或IIS上托管网页,并且您有一个带有提交按钮的Web表单,可能会发送一个包含您在表单中填写的数据的POST ...但是Web服务器做了什么这个?网页如何使用PUT和DELETE? PUT是什么?删除什么?它不像你在服务上调用某种方法,然后对数据库执行操作。我假设像ASP.NET这样的框架在这​​里发挥作用,但在vanilla HTTP / HTML中,我只是不知道它是如何组合在一起的......

我真的完全错过了一些东西......帮助赞赏!

3 个答案:

答案 0 :(得分:0)

您的问题都在RFC 2616中得到了解答,其中概述了服务器应如何对POSTPUTDELETE方法做出反应。每种方法(包括此处未提及的方法)都有自己的要求和建议。如果查看HTTP请求的raw text stream,您会注意到通过线路发送的第一个数据是HTTP动词。至于如何在服务器端实现这些方法,这完全取决于您正在编程的环境。例如,如果您使用PHP实现您的站点,您可以使用$_SERVER['REQUEST_METHOD']来确定应该如何处理请求。

答案 1 :(得分:0)

通常当您在IIS上托管您的网站(我在这里假设ASP .Net MVC)时,您到服务器端的请求将主要分为两类http动词,即GET或{{1} }。看看下面提到的ASP .NET MVC代码。在控制器级别,可以使用任何http动词来装饰我们的动作:

enter image description here

现在让我们首先了解我们是否使用普通的ASP .NET MVC框架(没有任何java脚本),然后为什么每个请求只分为两个类别,即POSTGET

假设我的网站中有一个视图(也就是一个网页),它负责注册访问我网站的新用户。您将看到如下控制器代码:

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动词用于在满足以下两个条件时创建/替换资源:

  1. 端点必须是幂等的:一遍又一遍地重做请求是安全的。
  2. URI必须是要更新的资源的地址。
  3. 您可以阅读有关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。

相关问题