http协议入门讲解

http协议入门讲解

通常,由HTTP客户端发起一个请求,服务端一旦收到请求,向客户端返回一个相应(一个请求的发出,有且只有一个响应)。

1.http请求

总的来说,HTTP请求报文格式就如下图所示


http协议入门讲解_第1张图片
HTTP请求格式

1.1请求格式

请求行 - 请求头 - 实体内容

GET /webDemo/Hellow HTTP/1.1  //请求行
Host: localhost:8080      //请求头
Connection: keep-alive
Accept: text/html
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
//空行 它的作用是通过一个空行,告诉服务器请求头部到此为止。
//实体内容

1.2请求行格式

GET /webDemo/Hellow HTTP/1.1
请求方法有:

  • GET:请求指定的页面信息,并返回实体主体。
  • HEAD: 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。根据幂等原则, 一般代表增加数据。
  • PUT :从客户端向服务器传送的数据取代指定的文档的内容。 根据幂等原则,一般代表修改数据。

幂等(idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。

幂等有以下几种定义:

对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。 比如绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a)) 。
对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在实数集中幂等,即max(x,x) = x 。

  • DELETE:请求服务器删除指定的页面。
  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
  • OPTIONS:允许客户端查看服务器的性能。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
    常用的请求方式主要是GET和POST(通常用于表单的提交),浏览器直接访问的请求,默认提交方式为GET。

1.3请求头格式

常见的请求行:
Accept:text/html,image/
请求报头域用于指定客户端接受哪些类型的信息

Accept-Charset: ISO-8859-1
求资源主机接受的编码格式

Accept-Encoding: gzip,compress
求资源主机接受的数据压缩格式

Accept-Language: en-us,zh
求资源主机接受的语言

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

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

Host: localhost:8080
(必须的)主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的

If-Modified-Since
客户机通过这个头告诉服务器,资源的缓存时间。只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答

Referer
客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面

User-Agent:
求资源主机浏览器类型

Cookie
客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一

Expires
文件在本地缓存的过期时间,如果浏览器发现缓存中的文件没有过期,则不发送请求(有例外,后面介绍)

Cache-Control
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。

请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。

  • public指示响应可被任何缓存区缓存。
  • private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请 求无效。
  • no-cache指示请求或响应消息不能缓存。
  • no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。   max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
  • min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
  • max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

Pragma
指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。

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

*Connection: *
求资源主机跟服务器连接状态
Connection: close 会发送请求后,自动断开连接
Connection: Keep-Alive 会发送请求后,依然保持连接

Range
Range头域可以请求实体的一个或者多个子范围

  • 表示头500个字节:bytes=0-499
  • 表示第二个500字节:bytes=500-999
  • 表示最后500个字节:bytes=-500
  • 表示500字节以后的范围:bytes=500-
  • 第一个和最后一个字节:bytes=0-0,-1
  • 同时指定几个范围:bytes=500-600,601-999

Date
求资源主机发出请求的时间

1.4请求数据格式

若方法字段是GET,则此项为空,没有数据

若方法字段是POST,则通常来说此处放置的就是要提交的数据

比如要使用POST方法提交一个表单,其中有user字段中数据为“admin”, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。

1.5请求的缓存设置

HTTP返回头部如下

(Status-Line) HTTP/1.1 200 OK
Date Thu, 26 Nov 200913:50:54 GMT
Server Apache/2.2.11 (Unix)PHP/5.2.9
Last-Modified Thu, 26 Nov 2009 13:50:19 GMT
Etag “8fb8b-14-4794674acdcc0″
Accept-Ranges bytes
Content-Length 20
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type text/html

当资源第一次被访问的时候,http返回200的状态码,并在头部携带上当前资源的一些描述信息,如

Last-Modified // 指示最后修改的时间
Etag // 指示资源的状态唯一标识
Expires // 指示资源在浏览器缓存中的过期时间

接着浏览器会将文件缓存到Cache目录下,并同时保存文件的上述信息

当第二次请求该文件时,浏览器会先检查Cache目录下是否含有该文件,如果有,并且还没到Expires设置的时间,即文件还没有过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求

如果文件此时已经过期,则浏览器会发送一次HTTP请求到WebServer,并在头部携带上当前文件的如下信息

If-Modified-Since Thu, 26 Nov 2009 13:50:19 GMT
If-None-Match ”8fb8b-14-4794674acdcc0″

即 把上一次修改的时间,以及上一次请求返回的Etag值一起发送给服务器。服务器在接收到这个请求的时候,先解析Header里头的信息,然后校验该头部信 息。 如果该文件从上次时间到现在都没有过修改或者Etag信息没有变化,则服务端将直接返回一个304的状态,而不再返回文件资源,状态头部如下

(Status-Line) HTTP/1.1 304 Not Modified
Date Thu, 26 Nov 200914:09:07 GMT
Server Apache/2.2.11 (Unix)PHP/5.2.9
Connection Keep-Alive
Keep-Alive timeout=5, max=100
Etag “8fb8b-14-4794674acdcc0″

这样,就能够很大程度上减少网络带宽以及提升用户的浏览器体验。 当然,如果服务器经过匹配发现文件修改过了,就会将文件资源返回,并带上新文件状态信息。

2.http响应

响应报文格式如下:
响应行 - 响应头 - 实体内容

Server: Apache-Coyote/1.1  //响应头
Content-Length: 0
Date: Thu, 18 May 2017 13:21:23 GMT
//空行 它的作用是通过一个空行,告诉响应头部到此为止。
//实体内容
http协议入门讲解_第2张图片
HTTP响应格式

HTTP响应与请求类似,主要了解的是其响应行的状态代码。

2.1响应状态码

  • 100-199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
  • 200-299 表示成功接收请求并已完成真个处理过程,常用200
  • 300-399 为完成请求,客户需进一步细化请求
  • 400-499 客户端的请求有错误,常用404
  • 500-599 服务器出现错误,常用500

2.2常见响应状态码

  • 200 表示请求处理完成并完美返回
  • 302 表示请求需要进一细化
  • 404 表示客户端访问的资源找不到
  • 500 表示服务端出现问题

2.3响应行格式

响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK

其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。

2.4响应头格式

常见的响应头字段含义:

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

  • Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE4、IE5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader(“Accept- Encoding”))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

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

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

  • Date:当前的GMT时间,例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

  • Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存。

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

  • Location:这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

  • Refresh:告诉浏览器隔多久刷新一次,以秒计。

  • Server:服务器通过这个头告诉浏览器服务器的类型。Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。Servlet一般不设置这个值,而是由Web服务器自己设置。

  • Set-Cookie:设置和页面关联的Cookie。Servlet不应使用response.setHeader(“Set-Cookie”, …),而是应使用HttpServletResponse提供的专用方法addCookie。

  • Transfer-Encoding:告诉浏览器数据的传送格式。

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

2.5响应体格式

响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。

3.http请求收发报文举例

3.1 DELETE请求

3.1.1请求报文

DELETE /file.html HTTP/1.1

3.1.2响应报文

HTTP/1.1 200 OK 
Date: Wed, 21 Oct 2015 07:28:00 GMT


  
    

File deleted.

3.2 PUT请求

3.2.1请求报文

PUT /new.html HTTP/1.1
Host: example.com
Content-type: text/html
Content-length: 16

New File

3.2.2响应报文

如果目标资源不存在,并且PUT方法成功创建了一份,那么源头服务器必须返回201 (Created) 来通知客户端资源已创建。

HTTP/1.1 201 Created
Content-Location: /new.html

如果目标资源已经存在,并且依照请求中封装的表现形式成功进行了更新,那么,源头服务器必须返回200 (OK) 或者204 (No Content) 来表示请求的成功完成。

HTTP/1.1 204 No Content
Content-Location: /existing.html

3.3 GET请求

GET /index.html

3.4POST请求

请求例子如下:
若使用默认的 application/x-www-form-urlencoded 做为 content type 的简单表单:

POST / HTTP/1.1
Host: foo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

say=Hi&to=Mom

使用 multipart/form-data 作为 content type 的表单:

POST /test.html HTTP/1.1 
Host: example.org 
Content-Type: multipart/form-data;boundary="boundary" 

--boundary 
Content-Disposition: form-data; name="field1" 

value1 
--boundary 
Content-Disposition: form-data; name="field2"; filename="example.txt" 

value2

3.5CONNECT

CONNECT www.example.com:443 HTTP/1.1
一些代理服务器在创建隧道时会要求进行身份验证。参见 Proxy-Authorization 首部。

CONNECT server.example.com:80 HTTP/1.1 
Host: server.example.com:80 
Proxy-Authorization: basic aGVsbG86d29ybGQ=

3.6 OPTIONS

HTTP 的 OPTIONS 方法 用于获取目的资源所支持的通信选项。客户端可以对特定的 URL 使用 OPTIONS 方法,也可以对整站(通过将 URL 设置为“*”)使用该方法。

OPTIONS /index.html HTTP/1.1
OPTIONS * HTTP/1.1

请求
curl -X OPTIONS http://example.org -i
响应

HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Expires: Thu, 20 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
x-ec-custom-error: 1
Content-Length: 0

你可能感兴趣的:(http协议入门讲解)