Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30107317
  • 博文数量: 230
  • 博客积分: 2868
  • 博客等级: 少校
  • 技术积分: 2223
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-08 21:48
个人简介

Live & Learn

文章分类

全部博文(230)

文章存档

2022年(2)

2019年(5)

2018年(15)

2017年(42)

2016年(24)

2015年(13)

2014年(1)

2012年(5)

2011年(58)

2010年(56)

2009年(9)

我的朋友

分类: 其他平台

2017-12-06 09:09:41

HTTP的报文格式解析

一、概述

  http报文是面向文本的,报文中每一个字段都是一些ASCII码串,各个字段的长度是不确定的。http有两类报文:请求报文  响应报文

二、请求报文

  一个http请求报文由

  • 请求行(request line)
  • 消息头部(header)
  • 空行
  • 请求正文  

 四部分组成;

  a、请求行

    请求行由请求方法字段、URL字段和HTTP协议版本字段,组成,它们用空格分隔,例如:GET /index.html  HTTP/1.1

    HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET和POST方法;

    GET:当client要从server中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给client

        使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号("?")代表URL的结尾与请求参数的开始,传递参数长度受限制例如:  /index.jsp?id=100&op=bind

    POST:当client给服务器提供信息较多时, 使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以key/value的形式出现,可以传递大量数据,可用来传递文件

  b、消息头部

    请求头部由key/value键值对组成,每行一对,key和value用冒号":"分隔,请求头部通知服务器有关于client端的请求信息,典型的请求头:

      • User-Agent:产生请求的浏览器类型
      • Accept:client端可识别的内容类型列表
      • Host:请求的主机名,允许多个域名同处一个ip地址,即虚拟主机    

  c、空行

    最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器请求头结束。

    对于一个完整的http请求来说空行是必须的,否则服务器会任务本次请求的数据尚未完全发送到server,处于等待状态

  d、请求正文

    请求数据不在GET方法中使用,而是在POST中使用。POST方法适用于需要client填写表单的场合,与请求数据相关的最常用的请求头是Content-Type 和Content-Length

HTTP请求格式:



[]
说明:第一行必须是一个请求行(request-line),用来说明请求类型,要访问的资源以及所使用的HTTP版本.
      紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息.
      之后是一个空行.
      再后面可以添加任意的其他数据[称之为主体(body)].
例1 GET请求:

GET / HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host:
Connection: Keep-Alive
说明:请求的第一部分说明了该请求是一个GET请求.该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录.该行的最后一部分说明使用的是HTTP1.1版本(另一个可选荐是1.0).
      第2行是请求的第一个首部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送.Connection,通常将浏览器操作设置为Keep-Alive
      第三部分,空行,即使不存在请求主体,这个空行也是必需的.

例2 POST请求:

POST / HTTP1.1
Host:
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley
说明:请求行开始处的GET改为POST,以表示不同的请求类型.
      Content-Type说明了请求主体的内容是如何编码的.浏览器始终以application/x-www-form-urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型.Content-Length说明了请求主体的字节数.
      最后请求主体.名称-值对的形式.

HTTP响应格式:



[]

例:

HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8


      
      
            
      

说明:HTTP状态码200,找到资源,并且一切正常.
      Date:生成响应的日期和时间.
      Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
      HTML源文体.



【HTTP请求】
[plain] view plain copy
  1. POST /add.php HTTP/1.1  
  2. User-Agent: curl/7.31.0  
  3. Host: 192.168.1.106  
  4. Accept: */*  
  5. Content-Length: 19  
  6. Content-Type: application/x-www-form-urlencoded  
  7. [空行]  
  8. value1=10&value2=22  

【HTTP响应】
[plain] view plain copy
  1. HTTP/1.1 200 OK  
  2. Date: Sun, 22 Dec 2013 02:47:03 GMT  
  3. Server: Apache/2.4.4 (Win32) PHP/5.4.16  
  4. X-Powered-By: PHP/5.4.16  
  5. Content-Length: 2  
  6. Content-Type: text/html  
  7. [空行]  
  8. 32  

HTTP请求中
POST  /add.php  HTTP/1.1中POST为请求方法, /add.php 为文件地址,HTTP/1.1为HTTP协议版本编号,该选项必须。
User-Agent: curl/7.29.0表示代理器的名称,该属性非必须。
Host: localhost为远程主机名称,在这里在localhost意为本机,此处也可以为192.168.1.106或者example.com等合法地址或域名,该属性为必须。
Accept: */*表示接受内容,该属性非必须。
Content-Length: 17表示被提交表单的长度,该属性为必须。
Content-Type: application/x-www-form-urlencoded表示表单的编码格式,该属性为必须。
name=xukai&age=26为表单内容,属于HTTP请求内容部分。
HTTP请求属性和HTTP请求内容之间存在一个空行

HTTP响应中:
HTTP/1.1 200 OK表示请求成功。
Content-Length: 2表示HTTP响应内容长度为2。
HTTP请求属性和HTTP请求内容之间存在一个空行
32表示HTTP负载内容,此处结果为32。

阅读(1931) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~