2

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

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

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

我真的在这里完全错过了一些东西......感谢帮助!

4

2 回答 2

0

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

于 2013-01-09T21:45:01.687 回答
0

通常,当您在 IIS 上托管您的网站(我在这里假设为 ASP .Net MVC)时,您发送到服务器端的请求将主要分为两类 http 动词,即GETor 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,因此下面提到的用HttpPostget 修饰的方法被调用。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 动词用于创建/替换资源:

  1. 端点必须是幂等的:一遍又一遍地重做请求是安全的。
  2. 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]

希望这可以帮助你得到一些澄清。

于 2017-03-26T12:29:33.900 回答