文档章节

HTTP 协议格式 和 HTTP Header

满小茂
 满小茂
发布于 2015/12/22 17:01
字数 1433
阅读 4833
收藏 169

HTTP请求数据:

HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成

HTTP请求信息由3部分组成:   

    ① 请求方法 URI 协议/版本

    ② 请求头(Request Header)

    ③     请求正文

   HTTP 请求 数据 例子举例:

 

GET/sample.Jsp HTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
 
username=jinqiao&password=1234


(1)请求方法URI协议/版本

  请求的第一行是“方法URL协议版本”:

GET/sample.jsp HTTP/1.1

 以上代码中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1代表协议和协议的版本。

  根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、 PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST。

 URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本 声明了通信过程中使用HTTP的版本。

(2)请求头(Request Header)

请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。

Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.


(3)请求正文

请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提 交的查询字符串信息:

username=jinqiao&password=1234

Http请求方法:

GET      请求获取由Request-URI所标识的资源。

POST Request-URI所标识的资源后附加新的数据。

HEAD 请求获取由Request-URI所标识的资源的响应消息报头。

OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需求。

PUT 请求服务器存储一个资源,并用Request-URI作为其标识。

DELETE 请求服务器删除由Request-URI所标识的资源。

TRACE 请求服务器回送收到的请求信息,主要用语测试或诊断。


HTTP响应数据:

Response Headers

响应头 

  1. Cache-Control:

    must-revalidate, no-cache, private。这个值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要从新请求服务器,不能从缓存副本中获取资源。 
    Cache-Control是响应头中很重要的信息,当客户端请求头中包含Cache-Control:max-age=0请求,明确表示不会缓存服务器资源时,Cache-Control作为作为回应信息,通常会返回no-cache,意思就是说,“不缓存就不缓存呗”;当客户端在请求头中没有包含Cache-Control时,服务端往往会定,不同的资源不同的缓存策略,比如说oschina在缓存图片资源的策略就是Cache-Control:max-age=86400,这个意思是,从当前时间开始,在86400秒的时间内,客户端可以直接从缓存副本中读取资源,而不需要向服务器请求。

  2. Connection:

    keep-alive,

    这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。关于长连接的更多知识,后面我再详细讲。

  3. Content-Encoding:

    gzip

    告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。

  4. Content-Type:

    text/html;charset=UTF-8

     告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。

  5. Date:

    Sun, 21 Sep 2014 06:18:21 GMT

    这个是服务端发送资源时的服务器时间,刚开始我不知道GMT是格林尼治所在地的标准时间,以为是服务器的时间错了,还去服务器上查看过时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。

  6. Expires:

    Sun, 1 Jan 2000 01:00:00 GMT

    这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有Cache-Control:max-age=***这个响应头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确。

  7. Pragma:no-cache

    这个含义与Cache-Control等同。

  8. Server:

    Tengine/1.4.6

    这个是服务器和相对应的版本,只是告诉客户端服务器信息,没有更多的意思。

  9. Transfer-Encoding:

    chunked

    这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了。

  10. Vary:

    Accept-Encoding

    告诉缓存服务器,缓存压缩文件和非压缩文件两个版本,现在这个字段用处并不大,因为现在的浏览器都是支持压缩的。

   

© 著作权归作者所有

共有 人打赏支持
满小茂
粉丝 73
博文 119
码字总数 131754
作品 0
成都
程序员
私信 提问
加载中

评论(2)

满小茂
满小茂

引用来自“YangMiao”的评论

这个图里面,响应包体前面的“空行(回车符 或 换行符)”是不是不对啊,我记得应该是跟上面的一样,必须是“回车 + 换行”。
恩,对,准确的说是 回车+换行,先回到段首,再换行
YangMiao
YangMiao
这个图里面,响应包体前面的“空行(回车符 或 换行符)”是不是不对啊,我记得应该是跟上面的一样,必须是“回车 + 换行”。
动手做webserver的核心之http解析

简介 webserver往小里说核心功能就是socket管理、url处理、http协议处理、业务dll管理等;下面简介绍一下http协议:超文本传输协议(HTTP)是一种通信协议,当时就是为web传输设计的一个基于t...

yswenli
07/17
0
0
“服务器提交了协议冲突.Section=ResponseHeader Detail=CR 后面必须是LF”的一些疑问

程序要下载“http://www.infzm.com/voice”这个页面的时候执行到图1-1红框那段代码的时候 提示:服务器提交了协议冲突.Section=ResponseHeader Detail=CR 后面必须是LF 图1-1 如果你的是C#编...

EricWe
2013/05/02
0
0
PHP中header()函数详细使用说明

一、作用: ~ PHP只是以HTTP协议将HTML文档的标头送到浏览器,告诉浏览器具体怎么处理这个页面,至于传送的内容则需要熟悉一下HTTP协议了,与PHP无关了,可参照http://www.w3.org/Protocols...

小姚
2012/05/20
0
0
从日常开发说起,浅谈HTTP协议是做什么的。

引言      HTTP协议作为Web开发的基础一直被大多数人所熟知,不过相信有很多人只知其一不知其二。比如咱们经常用到的session会话机制是如何实现的,可能很多人都说不出来吧。其实session...

zuoxiaolong8810
2017/03/23
0
0
header函数使用

void header ( string $string [, bool $replace = true [, int $http_response_code ]] ) ----- 用于向客户端发送原生的 HTTP 报头, 注意 header() 必须在任何实际输出之前调用,不管是普通...

ITCHN
2016/11/24
19
0

没有更多内容

加载失败,请刷新页面

加载更多

七牛qshell工具 批量删除操作

qshell 下载地址&文档(http://developer.qiniu.com/code/v6/tool/qshell.html) 这里我们演示的是windows下的操作,将下载的工具改名为:qshell.exe 然后将文件的路径添加到PATH 然后 点击 “...

koothon
46分钟前
1
0
Fastjson-fastjson中$ref对象重复引用问题

import java.util.ArrayList;import java.util.List;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.serializer.SerializerFeature;/** * fastjson中$ref对象......

小黄狗
52分钟前
1
0
mybatis一级缓存

mybatis执行查询的流程,最终都是通过动态代理进入到MapperProxy的invoke方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try......

wuyiyi
52分钟前
4
0
安装weblogic wls1033_generic.jar 遇见的坑

接别人的烂摊子,weblogic部署没部署成功不部署了 让我远程给别人部署weblogic 11g 部署完成启动域的时候启动不了报错如下 Unrecognized option: -jrockit Error: Could not create the Ja...

雁南飞丶
53分钟前
1
0
通过7个python函数理解区块链

我想对于那里的很多人来说,区块链就是这种现象,很难不让你头脑发热。我开始观看视频和阅读文章,但对我个人而言,直到我编写自己的简单区块链,我才真正理解它是什么以及它的潜在应用价值。...

笔阁
53分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部