精华内容
下载资源
问答
  • 常见的八种http请求方法及GET与POST的区别
    千次阅读
    2021-11-19 14:15:21

    HTTP协议简介

    超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。HTTP 的工作方式是客户机与服务器之间的请求-应答协议。web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。例如:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。

    HTTP的常用方法

    1.GET方法

    GET方法用于使用给定的URI从给定服务器中检索信息,即从指定资源中请求数据。使用GET方法的请求应该只是检索数据,并且不应对数据产生其他影响。

    2.POST方法

    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

    3.HEAD方法

    向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回,仅传输状态行和标题部分。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

    4.PUT方法

    PUT方法用于将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容。即向指定资源位置上传其最新内容。

    5.DELETE方法

    DELETE方法用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容。

    6.CONNECT方法

    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

    7.OPTIONS方法

    允许客户端查看服务器的性能。

    8.TRACE方法

    回显服务器收到的请求,主要用于测试或诊断。

    GET与POST的区别

    1.后退按钮/刷新

    GET:无害。

    POST:数据会被重新提交(浏览器应该告知用户数据会被重新提交)。

    2.书签

    GET:可收藏为书签。

    POST:不可收藏为书签。

    3.缓存

    GET:能被缓存。

    POST:不能被缓存。

    4.编码类型

    GET:application/x-www-form-urlencoded

    POST:application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。

    5.历史

    GET:参数保留在浏览器历史中。

    POST:参数不会保存在浏览器历史中。

    6.对数据长度的限制

    GET:当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的,URL 的最大长度是 2048 个字符。

    POST:没有限制。

    7.对数据类型的限制

    GET:只允许 ASCII 字符。

    POST:没有限制。也允许二进制数据。

    8.安全性

    GET:安全性较差,因为所发送的数据是 URL 的一部分。

    POST:更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。

    9.可见性

    GET:数据在 URL 中对所有人都是可见的。

    POST:数据不会显示在 URL 中。

    10.请求次数

    GET:发送一次http请求。

    POST:先发送请求头再发送请求体,相当于两次请求。

    11.刷新

    GET:不会刷新数据。

    POST:刷新,数据会被重复提交。

    12.速度

    GET:直接发送请求头和数据,所以快。

    POST:比get 慢,因为post在发送数据前会先将请求头发给服务器进行确认,然后才真正发送数据。

    更多相关内容
  • HTTP请求方法

    千次阅读 2021-12-24 16:37:12
    二、常用HTTP 方法-GET 方法-POST 方法-PUT 方法-HEAD 方法-DELETE 方法-OPTIONS 方法三、比较 GET 与 POST 一、什么是 HTTP? 看这篇文章的人应该对http都有一定的了解,这里就一笔带过了 超文本传输协议...

    一、什么是 HTTP?

    • 看这篇文章的人应该对http都有一定的了解,这里就一笔带过了

    • 超文本传输协议(Hypertext Transfer Protocol,缩写 HTTP)旨在启用客户端和服务器之间的通信。

    • HTTP 充当客户端和服务器之间的请求-响应协议。

    • 举例:客户端(浏览器)向服务器发送 HTTP 请求;然后服务器将响应返回客户端。响应包含有关请求的状态信息,也可能包含所请求的内容。

    二、常用HTTP 方法

    • GET
    • POST
    • PUT
    • HEAD
    • DELETE
    • PATCH
    • OPTIONS

    最常用的两种方法是:GET 和 POST。

    -GET 方法

    • GET 用于从指定资源请求数据

    请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:

    /test/demo_form.php?name1=value1&name2=value2
    
    • 有关 GET 请求的其他一些注释:
    1. GET 请求可被缓存
    2. GET 请求保留在浏览器历史记录中
    3. GET 请求可被收藏为书签
    4. GET 请求不应在处理敏感数据时使用
    5. GET 请求有长度限制
    6. GET 请求只应当用于取回数据(不修改)

    -POST 方法

    • POST 用于将数据发送到服务器来创建/更新资源

    通过 POST 发送到服务器的数据存储在 HTTP 请求的请求主体中:

    POST /test/demo_form.php HTTP/1.1
    Host: w3school.com.cn
    name1=value1&name2=value2
    
    • 有关 POST 请求的其他一些注释:
    1. POST 请求不会被缓存
    2. POST 请求不会保留在浏览器历史记录中
    3. POST 不能被收藏为书签
    4. POST 请求对数据长度没有要求

    -PUT 方法

    • PUT 用于将数据发送到服务器来创建/更新资源

    POST 和 PU T之间的区别在于 PUT 请求是幂等的(idempotent)。也就是说,多次调用相同的 PUT 请求将始终产生相同的结果。相反,重复调用POST请求具有多次创建相同资源的副作用。

    -HEAD 方法

    • HEAD 与 GET 几乎相同,但没有响应主体,即如果 GET /users 返回用户列表,那么 HEAD /users 将发出相同的请求,但不会返回用户列表

    HEAD 请求对于在实际发出 GET 请求之前(例如在下载大文件或响应正文之前)检查 GET 请求将返回的内容很有用。

    -DELETE 方法

    • DELETE 方法删除指定的资源。

    -OPTIONS 方法

    • OPTIONS 方法描述目标资源的通信选项

    三、比较 GET 与 POST

    • 因为GET和POST是最常用的,所以这里只对这两个HTTP方法进行对比:
    GETPOST
    后退按钮/刷新无影响数据会被重新提交(浏览器应该告知用户数据会被重新提交)
    书签可收藏为书签不可收藏为书签
    缓存能被缓存不能缓存
    编码类型application/x-www-form-urlencodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码
    历史参数保留在浏览器历史中。参数不会保存在浏览器历史中。
    对数据长度的限制有限制。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)无限制
    对数据类型的限制只允许 ASCII 字符没有限制。也允许二进制数据
    安全性与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中
    可见性数据在 URL 中对所有人都是可见的数据不会显示在 URL 中

    注意:在发送密码或其他敏感信息时绝不要使用 GET

    • 最后,在php中有一个$_REQUEST变量这个变量包含了在GETPOSTCOOKIE 的内容,有兴趣的可以取看一看,下面是$_REQUEST 变量的简单介绍:

    $_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。
    $_REQUEST 变量既可以收集GET方法发送的数据,也可以接受POST方法接受的数据。
    由于$_REQUEST中的变量通过GETPOSTCOOKIE 输入机制传递给脚本文件,因此可以被远程用户篡改而并不可信。这个数组的项目及其顺序依赖于 PHP 的 request_order 和 variables_order 指令的配置。

    展开全文
  • 常用的HTTP请求方法

    千次阅读 2019-07-15 17:20:53
    前端日常发送HTTP请求一般只用到GET, POST两种方法,如果是在一个符合RESTful设计规范的应用中,常用到5个方法。 PS: RESTful设计规范是前后端接口设计的一种规范,遵从了这一规范,可以大大节约沟通的成本,RESTful...

    前端日常发送HTTP请求最长用到GET, POST两种方法,如果是在一个符合RESTful设计规范的应用中,
    常用到5个方法:GET、POST、PUT、PATCH、DELETE。
    PS:

    RESTful设计规范是前后端分离接口设计的一种规范,在遵从了这一规范,可以大大节约沟通的成本,RESTful中借用HTTP各种方法的语义,约定了各接口的作用。

    客户端向服务端发送请求的信号称为请求报文,HTTP 请求报文由四部分组成,分别是请求行、请求头、空行和请求体,本文介绍的请求方法被包含在请求行中

    RESTful设计规范中的五个方法

    一、GET方法

    最常用的方法,它是发送一个请求来获取服务器上的资源,资源通过HTTP响应头和数据(如html文档,图片,样式,视频等)返回给客户端(如浏览器)。
    GET 请求可以在 URL 中附带查询参数,如test.php?id=1.

    • GET 请求可被缓存
    • GET 请求保留在浏览器历史记录中
    • GET 请求可被收藏为书签
    • GET 请求不应在处理敏感数据时使用
    • GET 请求有长度限制,不同浏览器的长度限制不同
    • GET 请求只应当用于取回数据
      如何发出一个get请求
    • 浏览器地址栏中输入网址访问资源都是通过GET方式发送HTTP请求
    • 表单的methods属性为get
    <form method="get" action="http://localhost:5000/api/login" >
      <input type="text" name="login_name" value="admin">
      <input type="text" name="login_password" value="123456">
      <input type="submit" value="提交"/>
    </form>
    

    3、ajax发送一个get请求

    var xhr=new XMLHttpRequest();
    xhr.open("GET","https://www.fastmock.site/mock/d6b39fde63cbe98a4f2fb92ff5b25a6d/api/getOne?id=1",true);
    xhr.send();
    xhr.onload =function(){
      console.log(xhr);
    }
    

    二、POST方法

    常用方法,用于向服务器提交数据,请求的参数要在请求体(body)中发送,可用于表单的提交和异步提交(如ajax),理论上,POST传递的数据量没有限制。

    • POST 请求不会被缓存
    • POST 请求不会保留在浏览器历史记录中
    • POST 不能被收藏为书签
    • POST 请求对数据长度没有要求

    由于HTTP协议只规定 POST 提交的数据必须放在消息主体(body)中,并没有规定数据必须使用什么编码方式。前后端交互时编码和解码就变的棘手,服务端通常是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式编码,再对body进行解析。

    常用的编码方式:

    • application/x-www-form-urlencoded 数据在发送到服务器之前,会将表单内的数据转换为键值对,比如,username=admin&password=123456,并将所有字符都会进行URL 转码。
    • multipart/form-data 数据将被编码为一条消息,以标签为单元,用分隔符分开,既可以上传键值对,也可以上传文件,通常用于上传二进制的文件
    • application/json 用来告诉服务端消息主体是序列化后的 JSON 字符串,前端无法将表单的enctype属性指定为application/json,通常使用ajax的方式发送这种编码形式的请求

    具体使用何种编码方式,需要前后端进行约定,目前比较常见的是文件上传时使用multipart/form-data,其他默认使用application/json编码方式。

    post方法提交数据,必须指定Content-Type头,如果不指定,浏览器会添加默认的Content-Type头。

    <form method="post" action="http://localhost:5000/api/login" enctype="application/x-www-form-urlencoded">
      <input type="text" name="login_name" value="test">
      <input type="text" name="login_password" value="123456">
      <input type="submit" value="提交"/>
    </form>
    

    也可以在js中创建一个FormData对象,提交表单,使用 FormData对象,浏览器会自动识别并添加请求头 “Content-Type: multipart/form-data”

    var formData = new FormData();
    formData.append("login_name", "test");
    formData.append("login_password", "123456");
    var xml= new XMLHttpRequest();
    xml.open("POST", "http://localhost:5000/api/users/login");
    xml.send(formData);
    

    常见的四种post提交数据编码格式

    三、PUT方法

    与POST方法类似,在RESTful设计规范中,一般POST方法代表新增,PUT方法代表整体更新,选择什么方法主要看接口的要求,PUT请求的参数一样要在HTTP请求的消息主体中发送,默认情况下put请求是无法提交表单数据的。

    四、PATCH方法

    与PUT方法类似,但PATCH方法通常应用于局部更新。

    五、DELETE方法

    删除某一个资源,默认情况下DELETE方法在 URL 中附带查询参数,也无法提交表单数据的。

    其他方法

    根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
    HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
    HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

    序号方法描述
    1GET请求指定的页面信息,并返回实体主体。
    2HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
    3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
    4PUTHTTP1.1 从客户端向服务器传送的数据取代指定的文档的内容。
    5DELETEHTTP1.1 请求服务器删除指定的页面。
    6CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
    7OPTIONSHTTP1.1 允许客户端查看服务器的性能。
    8TRACEHTTP1.1 回显服务器收到的请求,主要用于测试或诊断。
    9PATCHHTTP1.1 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

    前端要了解的HTTP知识
    HTTP请求头与响应头详解

    展开全文
  • HTTP协议漫谈 - HTTP协议请求方法

    千次阅读 2018-03-19 23:06:45
    前言 在上一篇文章《HTTP协议漫谈 - HTTP协议... ...其中起始行又分为请求行和状态行,请求行是HTTP请求中的起始行,它又包含了三个部分:请求方法,请求URI和HTTP协议版本。本文就来介绍HTTP请求中的请求方法。 ...

    前言

    在上一篇文章《HTTP协议漫谈 - HTTP协议历史和报文结构》中介绍了HTTP协议的历史和版本变化,以及HTTP协议报文的总体结构。

    按照HTTP/1.1 RFC文档中的定义,HTTP报文包括起始行,头域和消息体三个部分。其中起始行又分为请求行和状态行,请求行是HTTP请求中的起始行,它又包含了三个部分:请求方法,请求URI和HTTP协议版本。本文就来介绍HTTP请求中的请求方法。

    请求方法(Request Methods)

    HTTP协议的请求方法有很多,一般可以分为标准的请求方法和扩展的请求方法。标准的请求方法指的是在HTTP协议中定义的请求方法,扩展的请求方法指的是在其他协议中定义的请求方法。

    标准的请求方法

    在HTTP/1.0版本(RFC 1945)中定义了GET、POST和HEAD三个方法,在HTTP/1.1的最初版本(RFC 2068)中,则定义了GET、HEAD、PUT、POST、DELETE、TRACE、OPTIONS七个方法,在HTTP/1.1的第二版(RFC 2616)中,又增加了一个CONNECT方法,之后的HTTP/1.1的第三版(RFC 7231)中没有添加新的方法。这样,在HTTP/1.1中就有八个标准的HTTP请求方法:GET、HEAD、PUT、POST、DELETE、TRACE、OPTIONS和CONNECT。在HTTP/2(RFC 7540)中添加了一个PRI方法,它只在客户端和服务端建立连接时使用,PRI请求作为一个连接序言,其报文结构和一般的HTTP报文结构并不相同。

    HTTP协议要求HTTP服务端必须实现GET和HEAD方法,其他方法可以根据需要实现。此外,协议还要求,如果HTTP服务端接收到一个已经实现,但不能被用于相应的资源的请求方法,需要返回错误码405,表示Method Not Allowed。如果HTTP服务端接收到一个未知的方法,则需要返回错误码501,表示未实现 (Not Implemented)。(注意501并非只用于接收到未知的请求方法,还有其他情况也会返回501。)

    HTTP请求报文中直接将方法对应的名字写入到HTTP请求行中,请求方法区分大小写,所有标准的HTTP方法都是全部大写字母的,所以使用get和GET会是两个不同的方法。参考文章HTTP method names: upper or lower case?

    扩展的请求方法

    HTTP协议允许在其他协议或规范中对请求方法进行扩展,除了八个标准的HTTP方法外,还有一些扩展的HTTP方法。

    RFC 2068 19.6.1 Additional Request Methods一节中,描述了PATCH,LINK和UNLINK三个附加请求方法,这里的Additional Request Methods属于Additional Features一章,Additional Features并不属于HTTP/1.1标准的一部分,它仅仅提供了一些当时已有的HTTP实现中的协议元素用来参考,其中有一些是实验性的功能。在随后的RFC 2616中也提到,这三个方法并未普遍实现。此外,这里的描述是相当简略,并没有完整的定义这三个方法的语义。所以虽然这三个方法存在于HTTP协议的最初版本中,但并不作为标准的请求方法来看待,甚至很难将它们作为扩展的请求方法,因为它们并没有完整的语义。

    出于对部分资源更新的需求,PATCH方法又被重新定义在RFC 5789中,RFC 5789是一个PROPOSED STANDARD。不同于RFC 2068中的PATCH方法,在RFC 5789中完整的定义了PATCH方法的语义和用法,并给出了示例,可以认为这里的PATCH方法是一个新的方法,和RFC 2068中的PATCH方法仅仅是名字和基本概念相同。

    WebDAV是基于HTTP/1.1的一个扩展协议,最早定义在RFC 2518中,之后更新为RFC 4918。它在HTTP/1.1的基础上定义了一组额外的HTTP请求方法,头域和状态码等。其中新增请求方法主要有BIND,CHECKIN,CHECKOUT,COPY,DELETE,LOCK,MKCOL,MOVE,PROPFIND,PROPPATCH,REPORT,SEARCH ,UNBIND,UNCHECKOUT,UNLOCK,UPDATE等。

    无论是标准的HTTP方法还是扩展的HTTP方法都需要在IANA(Internet Assigned Numbers Authority)注册。IANA除了管理Internet中使用域名和IP地址外,另一项重要职责是对各个互联网协议中使用的名字和数字进行注册和分配。在IANA官网首页上对其职责的描述为。
    这里写图片描述

    从Protocol Registries进去就可以看到所有已注册的项目列表,其中比较常用的有:记录所有已注册的基于TCP/UDP的服务名及其端口号”Service Name and Transport Protocol Port Number Registry”;记录所有已注册的Mime类型的”Media Types”;以及和HTTP协议相关的”HTTP Method Registry”,”HTTP Status Codes”,”HTTP Upgrade Tokens”等。在HTTP Method Registry中可以找到已注册的HTTP方法列表。可以看到,这里包含了八个标准的HTTP请求方法,还包含了HTTP/2中定义的PRI方法,RFC 5789中定义的PATCH方法,RFC 2068中定义的LINK和UNLINK方法和WebDAV中定义的一系列方法。

    请求方法的属性

    在RFC 2068中,讨论了请求方法的两类属性,安全性和幂等性,在RFC 7231中,又增加了方法的可缓存性。

    安全的方法(Safe Methods)

    说到安全,一般都会想到保护数据不被窃取,保证系统不被攻击,但这里安全的含义并不是这样。一个安全的请求方法(safe method),指的是这个方法在语义上是只读的,它不会对服务器产生任何预期修改,一个安全的请求(safe request)指的是这条请求的请求方法是安全的。

    当客户端对某个资源(URI)执行了一个安全的请求方法,在语义上来说,表示它期望获得一些信息,而不是去主动改变服务端上的数据。对安全方法的合理使用,不应当对服务端产生有害的结果。这里对安全方法的定义特别强调了它是一个语义上的安全,区别于实现安全。站在客户端的角度来看,一个安全的请求应当是只读的,无害的。然而这并不能保证它在服务端的实现就一定是只读的,一个安全的请求方法在实现上可能会对服务器数据进行一些修改,这类修改通常是为了满足一定的业务需求,但如果没有恰当的实现,就可能会产生一些有害的结果。例如,大部分的服务端程序都会将请求信息写入到日志文件中,即使是一个安全的请求方法,仍然会在日志文件中写入这条请求。再比如,用户点击了网页上的一个广告,在产生一个安全的请求的同时,还需要对后台的广告账户进行计费操作。

    根据上述定义,GET,HEAD,OPTIONS和TRACE方法被认为是安全的方法,其他方法则被认为是不安全的。

    区分安全不安全的请求方法的主要目的在于,让网络爬虫和网页预加载程序能够安心工作,不用担心会造成什么危害。此外,它能够让浏览器在访问一些不被信任的页面时,对网页中执行的不安全的请求方法采取一定的策略来限制它们的活动。浏览器需要能够区分出不安全的请求,让用户能够在这些请求被提交之前,意识到可能存在的风险。

    幂等的方法(Idempotent Methods)

    在数学和计算机科学中,一项操作被称为幂等的表示这项操作执行任意多次和执行一次的结果是完全一样的。例如求绝对值的运算就是幂等的abs(abs(x))≡ abs(x)。

    对一个HTTP请求来说,如果一个请求方法多次独立执行和只执行一次对服务器产生的预期效果完全相同,则称这个请求方法是幂等的,同样的,如果一个请求的请求方法是幂等的,则称这个请求是幂等的请求。根据此定义,PUT,DELETE是幂等的方法,此外所有安全的请求方法也都是幂等的。

    这里有两点需要注意。
    1. 这里的幂等操作涉及的执行结果指的是对服务端产生的预期结果,并不是客户端得到的报文内容。例如,GET请求是幂等的,执行任意多次都不会对服务器产生任何预期修改。但这并不是说客户端每次执行GET得到的报文内容是一样的。
    2. 和安全性一样,幂等性同样是一种从客户端角度来看请求方法的性质,它同样是一种语义上的性质。它并不代表服务端实现上一定是幂等的。例如,服务端可以自由的为每条GET请求记录日志,也可以为每条PUT请求记录修改时间,显然,这时每次幂等的操作在服务端都会产生不同的结果,但这些不同的结果并非是客户端请求时所预期的。

    区分幂等操作的意义在于,当客户端发送一条请求后,在获取服务器响应前出现连接错误导致无法确定本次请求是否成功时,可以安全的再次重复这次请求,而不用担心会产生什么副作用。

    可缓存的方法(Cacheable Methods)

    在RCF 2616中并没有Cacheable Methods这一节内容,它是在RFC 7231中新增的。

    可缓存的请求方法指的是该方法对应的响应消息能够在客户端被存储,并在之后的请求中被直接使用,而不再需要从服务端重新获取。可缓存的方法有GET,HEAD和POST,但大部分的时候都只实现了GET和HEAD的缓存。

    方法的可缓存性只是标记了哪些方法的结果是可以被缓存的,哪些方法的结果则不需要考虑缓存,但是具体的缓存策略和缓存实现则非常复杂。在RFC 2616中用了专门的一章来讲述HTTP协议的缓存问题,而在最新的版本中,则将其写入到一个独立的RFC文档RFC 7234中。

    标准请求方法的属性

    根据上述定义,可以得到如下HTTP协议标准请求方法的分类表格。
    这里写图片描述

    常用请求方法的语义

    如前所述,标准的HTTP请求方法一共有八个:GET、HEAD、PUT、POST、DELETE、TRACE、OPTIONS和CONNECT。TRACE、OPTIONS和CONNECT由于在实际开发中几乎不会遇到,这里不打算介绍了,需要了解的可以查看RFC文档和相关文章。扩展请求方法中只有PATCH方法应用比较广泛。因此,下文只介绍GET、HEAD、PUT、POST、DELETE和PATCH方法的语义。

    在介绍具体的方法语义之前,先阐述一点,HTTP协议的请求方法都是从UA发起,服务端接收并作出响应,这些方法语义表达的是一个预期的结果,也就是UA发起这个请求后希望服务端如何处理这次请求。后文也会对这一点做进一步的阐述。

    1. GET方法
      GET方法用来向服务器请求指定的资源,它是万维网中信息检索的主要方式。当服务器收到一个GET请求后,它会将所请求的资源内容放到响应体中,客户端收到GET响应后,根据头域中的一些信息,对响应体进行解析,从而得到所需要的资源。

    2. HEAD方法
      HEAD方法用来请求资源的相关属性,而非资源本身,HEAD方法的响应消息中没有响应体。对HEAD请求,服务器需要保证对同一个URI,HEAD请求的响应内容和GET请求的响应内容去掉响应体后完全相同。

      在协议文档中没有对GET和HEAD请求中请求体的语义作出定义,为GET和HEAD请求添加请求体是允许的,但由于语义上未定义,所以服务器实现时有可能会直接将其丢弃,或拒绝连接,这取决于服务端的实现和配置。参见文章HTTP GET with request body

      GET和HEAD请求都是可缓存的,对GET请求的缓存可以在随后的GET和HEAD请求中使用,而对HEAD请求的缓存则只能在随后的HEAD请求中使用。此外,如果已有GET请求的缓存,但缓存已过期,或强制指定HEAD请求不使用缓存,则收到的HEAD请求的响应消息可能会被用来验证或更新之前的GET请求的缓存。

    3. POST方法
      POST方法用于将请求报文中的消息体message body提交给服务器,请求目标资源对消息体内容进行相应处理,这通常会导致服务器上的状态发生变化。

      常见的POST方法的使用场景有:

      • 提供一块数据,例如一组HTML表单数据,供服务器处理。
      • 在BBS,blog,新闻组等网络系统中发布文章或信息。
      • 在服务器上创建新的资源对象。
      • 向已有的资源中添加新的数据

      一般来说POST方法的响应消息是不被UA缓存的,除非服务器在响应消息中明确指定有效期(Freshness Lifetime)信息(表示服务器明确希望这条响应消息被UA缓存),但即使在响应消息中附带了有效期,也不能保证一定会被客户端缓存,因为POST缓存并未普遍实现。

    4. PUT方法
      PUT方法用于将请求报文中的消息体message body提交给服务器,请求服务器创建一个新的目标资源,或者替换原先的目标资源。当一个PUT请求被成功执行后,意味着使用同样的请求URI执行GET请求,在响应消息体中会得到和原先PUT请求中消息体的等价表示。但是,不能保证这种状态变化是可观察的,因为在接收到任何后续GET之前,目标资源可能已经会被其他UA执行的请求所修改,或者之前PUT请求所需要的修改正在被服务器处理但还没有完成,因为UA收到PUT方法的成功响应仅仅表示本次请求的意图已经被服务器接受,但并不代表服务器已经完成了资源创建或替换的工作。

    5. DELETE方法
      对DELETE方法,在RFC 2616中是这样描述的。

      The DELETE method requests that the origin server delete the resource identified by the Request-URI.

      DELETE方法用来请求源服务器删除请求URI标识的目标资源。

      然而在RFC 7231中,对这段描述做了修改,在RFC 7231中是这样描述的。

      The DELETE method requests that the origin server remove the association between the target resource and its current functionality.

      DELETE方法用来请求源服务器删除目标资源与其当前功能之间的联系。也就是说,在新的RFC文档中定义的DELETE方法删除的不再是目标资源,而是删除一种联系。文档中随后做了补充说明,如果目标资源具有一个或多个表示,则它们可能会也可能不会被原始服务器销毁,其关联的存储可能会也可能不会被回收,这完全取决于资源的性质以及源服务器的实现。这段话进一步的说明了,当客户端发送一条DELETE请求,它所预期删除的是这个请求URI相关的功能,而不是删除这个请求URI对应的资源本身,资源本身是否删除取决于资源的属性和服务器实现。

      举例来说,/article/details/123456表示一篇文章,客户端对这个URI发送一条DELETE请求,它所预期的是删除这个URI和对应文章之间的关联,之后无法通过这个URI来查看这篇文章内容,至于文章本身是否需要删除,由服务器自行决定。也许这篇文章有多个URI,/article/details/654321也表示这篇文章,那么显然对/article/details/123456发送DELETE请求,并不能影响到通过/article/details/654321来查看文章内容。

      和GET方法一样,在协议中没有对DELETE请求中请求体的语义作出定义。

      DELETE方法的响应本身不可缓存,但对一个URI成功执行DELETE方法,会导致该请求URI的其他缓存失效。

    6. PATCH方法
      PATCH方法用于对资源进行部分修改。由于PATCH不是标准的HTTP方法,所以不能保证客户端和服务端都已经实现。例如,在JDK中HttpURLConnection类就不支持将请求方法设置为PATCH。

    请求方法的选取

    在实际应用中经常能听到各种讨论,例如,如果将数据放在请求URI中,是否能用GET代替POST来提交数据?PUT和POST都是用来提交数据,它们的区别是什么,能否用PUT替代POST使用?PUT和PATCH又该如何选取,既然PATCH用作局部更新,那它同样也可以用作全部更新,是否能用PATCH替代PUT使用?

    当遇到这类问题时,我们可以从语义上给出一系列的解释,指明它们该如何使用,以及不能混用的原因。

    GET和POST的选取

    在知乎上的这篇《get和post区别?》中对GET和POST的语义和用法做了很多分析。GET和POST从语义上来说很容易区分。GET在语义上用于请求指定的资源,它的安全的幂等的,不能被用来添加或更改服务器上的资源。而POST则是不安全,不幂等的,它的用途和GET相反,用来对创建新的资源,或对已有资源进行修改。所以如果要提交的数据用来查询,则使用GET方法,如果要提交的数据用来创建或修改,则用POST方法。例如,获取某个用户的信息,获取某个帖子的评论应该用GET方法,而注册用户,发表评论,点赞等则使用POST方法。

    POST和PUT的选取

    在RFC 2616中是这样描述POST和PUT的区别的。

    The fundamental difference between the POST and PUT requests is reflected in the different meaning of the Request-URI. The URI in a POST request identifies the resource that will handle the enclosed entity. That resource might be a data-accepting process, a gateway to some other protocol, or a separate entity that accepts annotations. In contrast, the URI in a PUT request identifies the entity enclosed with the request – the user agent knows what URI is intended and the server MUST NOT attempt to apply the request to some other resource. If the server desires that the request be applied to a different URI, it MUST send a 301 (Moved Permanently) response; the user agent MAY then make its own decision regarding whether or not to redirect the request.

    POST和PUT的区别在于请求URI代表的含义不同,对POST请求来说,URI表示对实体(也就是请求体message body)进行处理的资源,它可能是一个数据接受的过程,也可能是一个跳转到其他协议的网关,或者是一个接受注释的实体。而PUT请求中请求URI表示实体本身,一般就是实体对应的资源在服务器的地址。这段话相当抽象和难以理解,以下是个人对这段话的一些理解。

    对POST请求来说,URI表示对实体进行处理的资源,它实质上代表的是一种处理实体的方式。当客户端发送一条POST请求后,它希望服务器用请求URI代表的处理方式对请求体中的实体进行处理,至于请求URI代表何种处理方式,如何处理实体内容,取决于实际的业务逻辑。例如,可以用/api/comments表示一个发表评论的接口,客户端向这个地址发送一条POST请求,表示希望使用实体作为评论内容来发表一条评论,再比如/api/pay/buy_something表示付费购买接口,客户端向这个地址发送一条POST请求,表示希望对实体中所携带的商品信息进行付费购买操作。和发表评论不同的是,这里并没有将实体内容保存到某个资源中。一个请求URI也可以代表多种不同的处理,虽然这并不常见,例如同样是/api/comments接口,可以约定当添加消息头clear=true后,服务器会清空评论列表,当添加close=true后,服务器会关闭评论功能,这样/api/comments接口就有了发表评论,清空评论和关闭评论三个功能(当然清空评论和关闭评论的功能应当只对管理后台开放)。此外,POST请求也可以不需要实体,例如/api/comments/{id}/like表示一个对某条评论点赞的接口,客户端向这个地址发送一条POST请求,表示希望对这条评论进行点赞或取消点赞,服务端可以自行根据当前是否已点赞来决定是点赞还是取消点赞。

    对PUT请求来说,请求URI表示某个资源在服务器的地址,它不表示对实体进行处理的方式,因为PUT请求对实体处理方式是固定的,也就是用实体内容替换请求URI对应的资源的内容。当客户端发送一条PUT请求后,客户端的目的是将这条请求中的请求URI对应的资源内容被请求体中的数据所取代。例如,/api/comments/1992表示一条评论的地址,客户端向这个地址发送一条PUT请求,就表示希望使用实体内容替换此地址原先的评论内容。

    从这里可以看出,PUT请求实际上可以看成是一类特殊的POST请求,它表示的是一种固定处理方式的POST方法。换句话说,可以将PUT方法看成是从POST方法中分化出来的,专门用来处理用实体内容覆盖原先资源内容这样一种处理方式的POST方法。

    在前面介绍请求方法历史的时候有提到,最初的HTTP协议只有GET、POST和HEAD三个方法,之后才添加了其他的方法。从上述结论和方法的语义上可以很容易的推论,PUT,DELETE和PATCH方法都是从POST方法中分化出来的,方法本身代表了对实体的处理方式,请求URI则退化为表示资源的地址。

    回到之前的问题,由于POST方法的语义涵盖了PUT,DELETE和PATCH,所以无论何时,都可以用POST方法替代PUT,DELETE和PATCH来使用。但反过来,PUT,DELETE和PATCH方法只有在各自特定的场景下,才可以替代POST方法。

    PUT和PATCH的选取

    在语义上,PUT方法用于全量更新,而PATCH方法则适用于部分更新。对PUT来说,如果要更新一个资源,需要将该资源的全部内容都附加在报文的消息体中,即使是那些没有更改的部分,而PATCH方法则只需要提交那些有变化的部分。

    语义和实现之争

    虽然我们已经语义上给出这些方法的一系列的差异,但这并不能打消使用上的所有疑虑。这一方面是因为标准方法定义的语义并不能涵盖所有的业务场景,另一方面很多时候实现会和语义产生偏差。

    在之前在讨论请求方法的安全性和幂等性的时候就明确了一点,语义上的安全性并不等于实现上就是安全的,语义上的幂等性也不等于实现上的幂等性。同样的,对请求方法来说,虽然协议对各个请求方法的语义做了明确的指定,但语义不同于语法,语义对实现并没有实质性的约束,具体到每个接口的实现上,并不能保证它们一定会按照协议上的语义要求来实现。因此,在实现上完全可以用GET方法提交数据,也可以用PATCH替代PUT,甚至你还可以用GET来删除数据,用DELETE来做数据更新,这完全取决于服务端的实现。当然除非是个人的实验性项目,实际开发是不会这样来做的。这就像写代码的时候用setData()表示获取数据,getData()表示更新数据一样,虽然编译、运行都不会有任何问题,但这除了迷惑自己外显然毫无意义。

    因此,服务器在实现一个接口时,一般需要遵循协议中规定的语义,不能随意发挥,尤其是不能改变方法的安全性,幂等性和可缓存性,这除了能够保持统一的上下文环境,便于自己和他人的理解外,另一个重要的原因是,可以保持对UA和现行的互联网基础设施的兼容性。UA,CDN和网络中间节点需要根据标准方法语义的可缓存性来实现响应消息的缓存,网络爬虫也需要根据标准方法语义的安全性来决定是否执行请求。

    后记

    尽管已经用上了所有的空余时间,这篇《HTTP协议请求方法》仍然花了两周的时间才勉强完成,进度比预期要慢。文章在发表之前就已经修改了很多次,从19日发表之后到现在(22日)又做了十多次的修改,总体上是已经比较完善了,然而有些地方依然有欠缺,等后面有时间再来修补吧。接下来事情更多,所以后面的几篇HTTP协议文章的时间也许会更长。

    下一篇预计会介绍HTTP协议的请求URI,包括URI的语法,编解码和用法等,会同时涵盖URL和URN的内容。

    展开全文
  • HTTP请求方法OPTIONS预检请求

    千次阅读 2020-01-16 19:12:44
    就是参数为OPTIONS的第一次请求,他的作用是用于试探性的服务器响应是否正确,即是否能接受真正的请求,如果在options请求之后获取到的响应是拒绝性质的,例如500等http状态,那么它就会停止第二次的真正请求的访问。...
  • HTTP请求方法详解

    万次阅读 2016-04-27 12:39:47
    HTTP请求方法并不是只有GET和POST,只是最常用的。据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。这8种我们一起来分析一下,其中最常用的也...
  • HTTP请求方式中8种请求方法(简单介绍)

    万次阅读 多人点赞 2018-08-10 13:51:00
    HTTP请求方式中8种请求方法(简单介绍) 简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是...
  • 根据HTTP标准,HTTP请求可以使用多种请求方法。 HTTP的1.0版本中只有三种请求方法: GET, POST 和 HEAD方法。到了1.1版本时,新增加了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 GET 请求指定...
  • 通常,由HTTP客户端发起一个请求请求报文),建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个响应报文。HTTP的...
  • Postman:请求方法、认证

    千次阅读 2019-09-25 21:10:04
    Postman支持所有的HTTP请求方法,包括一些很少使用的请求方法,如PROPFIND、UNLINK等 GET请求 1、HTTP GET请求方法是从服务器检索数据,数据由统一资源标识符(URI)标示。 2、GET请求将参数拼接在URI...
  • 两种 HTTP 请求方法:GET 和 POST

    万次阅读 多人点赞 2016-10-24 11:04:10
    两种 HTTP 请求方法:GET 和 POST 在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。 GET - 从指定的资源请求数据。POST - 向指定的资源提交要被处理的数据   GET POST ...
  • HTTP 请求方法和响应头信息

    千次阅读 2020-09-23 14:32:55
    HTTP 请求方法 根据 HTTP 标准,HTTP 请求可以使用多种请求方法HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。 HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。 ...
  • 本篇我们来学习HTTP中常见的请求方法,一般我们都知道有GET和POST两种,其他的可能就记得不是很清楚。其实,和数据库操作一样,HTTP请求也有好几种,至少是有增删改查这四种方法。为了弄清楚这几种方法和方法的含义...
  • HTTP协议以及HTTP请求中8种请求方法

    万次阅读 2017-11-29 23:01:14
    HTTP协议以及HTTP请求中8种请求方法 什么是协议?  协议,是指通信的双方,在通信流程或内容格式上,共同遵守的标准。 什么是http协议?  http协议,是互联网中最常见的网络通信标准。 http协议的...
  • HTTP请求方法

    万次阅读 2019-09-20 15:59:30
    UT, DELETE, TRACE 和 CONNECT 方法。 序号 方法 描述 1 GET 请求指定的页面信息,并返回实体主体。 2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 3 POST 向指定...
  • HTTP请求的完全过程

    万次阅读 多人点赞 2019-05-27 11:22:45
    HTTP请求的完全过程 1.1 浏览器根据域名解析IP地址 浏览器根据访问的域名找到其IP地址。DNS查找过程如下: 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存)...
  • 2.4 HTTP请求方法

    千次阅读 2020-06-30 15:23:11
    HTTP/1.1中,共定义了8种请求方法,具体如下。 GET:请求指定的内容并返回。 POST:向指定资源提交数据处理请求(例如提交表单或者上传文件)。请求数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有...
  • 一直在测试REST模式的WEB SERVICE接口,客户端的HTTP请求方式一般分为四种:GET、POST、PUT、DELETE,这四种请求方式有什么不同呢。简单的说,GET就是获取资源,POST就是创建资源,PUT就是更新资源,DELETE就是...
  • Nginx配置跨域-http请求方法OPTIONS

    万次阅读 2017-12-15 14:47:14
    Nginx配置跨域 http请求方法OPTIONS 看到标题有点扯,为什么跨域与http的请求方法options有关系,因为当你跨域获取资源时,浏览会出于安全的考虑会先使用OPTIONS做请求,看能否正常返回,因为使用OPTIONS返回的是...
  • http请求中get和post方法的区别

    千次阅读 多人点赞 2020-11-06 10:50:09
    HTTP定义了与服务器交互的不同方法,其中最基本的四种:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被称为安全方法,因为使用GET和HEAD的HTTP请求不会产生什么动作。不会产生动作意味着GET和HEAD的HTTP请求不会在...
  • HTTP规范中定义了一组常用的请求方法。比如, GET方法负责从服务器获取一个 文档, POST方法会向服务器发送需要处理的数据, OPTIONS方法用于确定Web 服务器的一般功能, 或者Web服务器处理特定资源的能力。 HTTP...
  • HTTP请求方法OPTIONS

    万次阅读 2017-10-28 10:39:56
    HTTP请求方法并不是只有GET和POST,只是最常用的。据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。 HTTP请求方法并不是只有GET和POST,只是最...
  • 一,HTTP请求方法 常用请求方法 其他请求方法 二,HTTP请求作用 三,HTTP请求整体格式 常见的请求体数据类型: 四,使用Fidder抓包工具进行验证 验证GET请求 验证POST请求 五,GET和POST的区别 一,HTTP...
  • HTTP请求方法 之 HEAD

    千次阅读 2016-09-23 11:11:44
    HTTP请求方法并不是只有GET和POST,只是最常用的。据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。 官方定义 HEAD方法跟GET方法
  • 一、标准Http协议支持六种请求方法: 1、GET 2、POST 3、PUT 4、Delete 5、HEAD 6、Options 二、不同请求方法的用途: 1,GET: GET可以说是最常见的了,它本质就是发送一个请求来取得服务器上的某一资源。资源...
  • HTTP的8种请求方式

    千次阅读 2020-08-11 09:41:51
    HTTP的8种请求方式HTTP简介HTTP的8种请求方法1、OPTIONS2、HEAD3、GET4、POST5、PUT6、DELETE7、TRACE8、CONNECT注意: HTTP简介   HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认...
  • http 几种请求方法的差别

    万次阅读 多人点赞 2016-09-19 14:45:22
    在其中有8个不同的请求方法: GETPOSTHEADPUTDELETEOPTIONSTRACECONNECT 这8个方法中GET和POST最常见。 1. GET方法 [plain] view plain copy 它本质就是发送一个请求来取得服务器上的某一资源...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,629,832
精华内容 651,932
关键字:

http请求方法