编程技术文章分享与教程

网站首页 > 技术文章 正文

学习笔记-HTTP 请求方法详解 学习笔记-HTTP 请求方法详解法

hmc789 2024-11-13 11:33:02 技术文章 2 ℃

HTTP是什么

HTTP协议(Hyper Text Transfer Protocol,超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守此标准。HTTP它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

工作原理

HTTP是基于客户/服务器模式,且面向连接的。主要有以下四步:

(1)客户与服务器建立连接;

(2)客户向服务器提出请求;

(3)服务器接受请求,并根据请求返回相应的文件作为应答;

(4)客户与服务器关闭连接。

特别说明:

HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到WWW服务器面向的是Internet中成千上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率,可以节省传输时间。

HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。即服务器不保留与客户交易时的任何状态。这就大大减轻了服务器记忆负担,从而保持较快的响应速度。但是缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

请求方法

HTTP请求方法主要有九种。此外还有LINK和UNLINK,不过已被HTTP/1.1废弃。

HTTP0.9这是HTTP最早大规模使用的版,现已过时。只有GET一种请求方法。

HTTP1.0 支持了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1 新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE 和 CONNECT 方法。

在HTTP/1.1标准制定之后,又陆续扩展了一些方法。其中使用中较多的是 PATCH方法

在此处我们要引入两个概念,即等幂性和安全性,之前向大家介绍过这两个概念,这里只是大致提一下。(详见学习笔记-RESTful基本规范)

等幂性:简单点说就是一次请求和多次请求,资源的状态是一样。

安全性:对该接口访问,不会使服务器端资源的状态发生改变。

GET:GET请求会显示请求指定的资源。一般来说GET方法应该只用于数据的读取,而不应当用于会产生副作用的非等幂的操作中。GET会方法请求指定的页面信息,并返回响应主体,GET被认为是不安全的方法,因为GET方法会被网络蜘蛛等任意的访问。

HEAD:HEAD方法与GET方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应HEAD请求时不会回传资源的内容部分,即:响应主体。这样,我们不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。

POST:POST请求会 向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。POST方法是非等幂的方法,因为这个请求可能会创建新的资源或/和修改现有资源。

PUT:PUT请求会身向指定资源位置上传其最新内容,PUT方法是等幂的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。

DELETE:DELETE请求用于请求服务器删除所请求URI所标识的资源。DELETE请求后指定资源会被删除,DELETE方法也是等幂的。

CONNECT:CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。

OPTIONS:OPTIONS请求与HEAD类似,一般也是用于客户端查看服务器的性能。 这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用'*'来代替资源名称,向服务器发送OPTIONS请求,可以测试服务器功能是否正常。

TRACE:TRACE请求服务器回显其收到的请求信息,该方法主要用于HTTP请求的测试或诊断。

PATCH:PATCH与PUT请求类似,同样用于资源的更新。不同的是PATCH一般用于资源的部分更新,而PUT一般用于资源的整体更新。当资源不存在时,PATCH会创建一个新的资源,而PUT只会对已在资源进行更新。

特别说明:

(1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405;当服务器不认识或者不支持对应的请求方法时,应返回状态码501。

(2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。

请求头

请求头用于说明是谁或什么在发送请求、请求源于何处,或者客户端的喜好及能力。服务器可以根据请求头部给出的客户端信息,试着为客户端提供更好的响应。请求头域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Unmodified-Since、Proxy-Authorization、Range、Referer、User-Agent等。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。

Accept,浏览器端能够处理的内容类型。例如: Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档。如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。通配符 * 代表任意类型,例如 Accept: */* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。

Accept_Charset,浏览器能够显示的字符集。

Accept-Encoding:浏览器能够进行解码的数据编码方式,通常指定压缩方法,是否支持压缩,支持什么压缩方法,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。

Accept-Language, 浏览器当前设置的语言。 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。

Authorization,授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。

From,请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

Host,发送请求的页面的域名。(发送请求时,该报头域是必需的),请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

If-Modified-Since,浏览器缓存时间记录。 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。

If-Match,如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作,获取文档。

If-None-Match, If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能。

If-Range浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的ETag 或者自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。

If-Unmodified-Since,如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。

Proxy-Authorization,浏览器响应代理服务器的身份验证请求,提供自己的身份信息。

Range,浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546

Referer,发送请求的页面的URI。当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理。

User-Agent,浏览器的用户代理字符串。告诉HTTP服务器, 客户端使用的和浏览器的名称和版本。

If-Modified-Since,只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304"Not Modified"应答。

Connection,浏览器与服务器的连接类型,表示是否需要持久连接。Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。 Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭。当客户端再次发送Request,需要重新建立TCP连接。

Cookie,用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),这是最重要的请求头信息之一。如Cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个Cookie来存储相关信息,这样浏览器通过读取Cookie的信息去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。当然Cookie里面的数据不仅仅是上述范围,还有很多信息可以存储是Cookie里面,比如sessionid等。

Cache-Control,指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据,还是重新发请求到服务器获取数据。网页的缓存控制是由HTTP中的"Cache-control"来实现的,常见值有private、no-cache、max-age、must-revalidate等,默认为private。

Content-Length:表示请求消息正文的长度。

Pragma,指定"no-cache"值表示服务器必须返回一个刷新后的文档,即使它是而且已经有了页面的本地拷贝。

UA-Pixels,UA-Color,UA-OS,UA-CPU,由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

响应头

响应头向客户端提供一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令。这些头部有助于客户端处理响应,并在将来发起更好的请求。响应头域包含Age、Location、Public、Server、Vary、WWW-Authenticate等。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。

Age,当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。

Location,表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HTTPServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

Public:指示响应可被任何缓存区缓存,可以用缓存内容回应任何用户。

Server,服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。WEB 服务器表明自己是什么软件及版本等信息。例如:Server:Apache/2.0.61 (Unix)

Vary,WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。假如源WEB服务器在接到第一个请求消息时,其响应消息的头部为:Content-Encoding: gzip; Vary: Content-Encoding,那么Cache服务器会分析后续请求消息的头部,检查其Accept-Encoding,是否跟先前响应的Vary头部值一致,即是否使用相同的内容编码方法,这样就可以防止Cache服务器用自己Cache 里面压缩后的实体响应给不具备解压能力的浏览器。例如:Vary:Accept-Encoding。

WWW-Authenticate,客户应该在Authorization中提供什么类型的授权信息。在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问

Accept-Ranges,WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。

Allow,服务器支持哪些请求方法(如GET、POST等)。

Content-Encoding,文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。

Content-Length,表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。

Content-Type,表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HTTPServletResponse提供了一个专用的方法setContentType。

Date,当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

Expires,过期时间。应该在什么时候认为文档已经过期,从而不再缓存它?

Last-Modified,文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。

Refresh,表示浏览器应该在多少时间之后刷新文档。

Set-Cookie,设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HTTPServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。

状态码

HTTP状态码用来告诉客户端发生了什么事情。状态码是在每条响应报文的起始行返回的,会返回一个数字状态和一个可读的状态。数字码便于程序进行差错处理,原因短语便于人们理解

200到299之间的状态码表示成功,300到399之间的代码表示资源已经被转移走啦,400到499之间的代码表示客户端请求出错了,500到599之间的代码表示服务器出错了

此处只是HTTP的相关状态码。RESTful有一套自己的标准,详见学习笔记-RESTful基本规范。

1XX:信息状态码

100===>继续===>初始的请求已经接受,请客户端继续发送剩余部分

101===>切换协议===>请求者要求服务器切换协议,服务器已确定切换

2XX:成功状态码

200===>成功===>服务器已成功处理了请求

201===>已创建===>请求成功并且服务器创建了新的资源

202===>已接受===>服务器已接受请求,但尚未处理

203===>非授权信息===>服务器已成功处理请求,但返回的信息可能来自另一个来源

204===>无内容===>服务器已成功处理请求,但返回的资源可能来自另一个来源

205===>重置内容===>服务器处理成功,用户终端重置文档视图

206===>部分内容===>服务器成功处理了部分GET请求

3XX:重定向状态码

300===>多种选择===>针对请求,服务器可执行多种操作

301===>永久移动===>请求的页面已永久跳转到新的url

302===>临时移动===>服务器目前从不同位置的网页响应请求,但请求仍继续使用原有位置来进行以后的请求

303===>查看其他位置===>请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码

304===>未修改===>自从上次请求后,请求的网页未修改过

305===>使用代理===>请求者只能使用代理访问请求的网页

307===>临时重定向===>服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求

4XX:客户端错误状态码

400===>错误请求===>服务器不理解请求的语法

401===>未授权===>请求要求用户的身份验证

403===>禁止===>服务器拒绝请求

404===>未找到===>服务器找不到请求的页面

405===>方法禁用===>禁用请求中指定的方法

406===>不接受===>无法使用请求的内容特性响应请求的页面

407===>需要代理授权===>请求需要代理的身份认证

408===>请求超时===>服务器等候请求时发生超时

409===>冲突===>服务器在完成请求时发生冲突

410===>已删除===>客户端请求的资源已经不存在

411===>需要有效长度===>服务器不接受不含有效长度表头字段的请求

412===>未满足前提条件===>服务器未满足请求者在请求中设置的其中一个前提条件

413===>请求实体过大===>由于请求实体过大,服务器无法处理,因此拒绝请求

414===>请求url过长===>请求的url过长,服务器无法处理

415===>不支持格式===>服务器无法处理请求中附带媒体格式

416===>范围无效===>客户端请求的范围无效

417===>未满足期望===>服务器无法满足请求表头字段要求

5XX:服务端错误状态码

500===>服务器错误===>服务器内部错误,无法完成请求

501===>尚未实施===>服务器不具备完成请求的功能

502===>错误网关===>服务器作为网关或代理出现错误

503===>服务不可用===>服务器目前无法使用

504===>网关超时===>网关或代理服务器,未及时获取请求

505===>不支持版本===>服务器不支持请求中使用的HTTP协议版本


本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联删。

标签列表
最新留言