目前常用的报文格式

来源:互联网 发布:天池大数据算法 编辑:程序博客网 时间:2024/05/13 09:29

以下简单介绍了常见的三种报文格式:8583、XML、HTTP;

1. ISO8583

字段数据类型:字母、数字、特殊字符、年月日等时间、二进制数据;
8583报文为了解决网络带宽的问题,引入包头,即在报文前面加上包头,我们用16个字节,即128个bit(一个字节等于8bit)来表示128个字段中的某个字段是否存在。每个bit在计算机的二进制里面不是1就是0,如果是1就表示对应的字段在本次报文中存在,如果是0就是不存在。如果别人接收到了ISO8583报文,可以先根据最前面的报文头,就知道紧接着报文头后面的报文有哪些字段,没有哪些字段了。比如,我要发送5个字段,分别属于128个字段中的第2、3、6、8、9字段,我就可以将128bit的报文头填成011001011000000000………..,一共128个bit,后面就全是0了。注意其中第2、3、6、8、9位为1,其他都为0。

   有了这个128bit的报文头,我们就可以只发送需要的5个字段了。怎样组织报文?先放上这128bit,即16个字节的头,然后在头后面放2、3、6、8、9字段,这些字段紧挨在一起,3和6之间也不需要填上4、5这两个字段了。接收方收到这个报文,它会根据128bit的报文头来解包,它自然知道把第3个字段取出后,就直接在第3字段的后面取第6个字段,每个字段的长度在ISO8583里面都定义好了,很轻松就把数据包解出来了。

   我们把这16个字节称为bit map,即位图,用来表示某个位是否存在。考虑到很多时候报文不需要128个字段这么多,其一半64个字段都不一定能够用完。那我可以将报文头由128bit减到64bit,只有在需要的时候才把剩下的64bit放到报文里面,这样报文长度又少了8个字节;

   我们把ISO8583的128个字段中最常见的都放到前64个字段中,那我们可以将处理缩小一倍。这样我一般发送报文时只需发送64bit,即一个字节的报文头,再加上需要的几个字段就可以了。如果有些报文用到64到128之间的字段呢?这个也好办,我把64bit报文头的第一位bit用来代表特殊含义,如果该bit为1,则表示64bit后面跟了剩下的64bit报文头;如果第一位bit为0,则表示64bit后面没有跟剩下的64bit报文头,直接是128个字段中的报文了。那们,接收方会判断一下报头的第一个bit是1还是0,从而知道报文头是64bit还是128bit了,就可以做相应处理。因为报文头第二个64bit属于有时候有,所以我们叫它Extended bit map扩展位图,相应的报文头最开始的64bit我们叫它Primary bit map主位图。我们直接把扩展位图固定放到128个字段的第一个字段,而主位图每个数据包都有,就强制性放在所有128个字段的前面,并不归入128个字段中去。

    如果某些字段的长度不固定,属于变长怎么办,因为你现在解包是当作数据包每个字段都是固定的,用C语言解包时直接依靠指针取固定长度的一串字符做为一个字段?比如第2个字段是“帐号”,是不定长的,可能有的银行帐号是19位,有的是17位等。我们定ISO8583规范时可以规定第2个字段是25位,这下足够将19和17的情况都包含进来,但是如果以后出现了30位的怎么办?那我们现在将字段定为100位。以后超过100位怎么办,况且如果你只有19位的帐号,我们定义了100位,那81位的数据不是浪费了网络的带宽。看来预先定义一个我们认为比较大的位数是不太好的。
  
    我们这样,对于第2个字段“帐号”,在字段的开头加上“帐号”的长度。比如帐号是0123456789,一共10位,我们变成100123456789,注意前面多了个10,表示后面的10位为帐号。如果你接触过COM里面的BSTR,应该对这种处理比较熟悉了。接收方收到该字段后,它知道ISO8583规定第2个字段“帐号”是变长的,所以会先取前面的2位出来,获取其值,此时为长度,然后根据该长度值知道应该拷贝该字段后面哪几位数据,才是真正的帐号。如果你觉得长度如果只有两位最多只能表示99位长,不太够,我们也定义可以允许前面3位都为长度的变长字段,这样就有999位长,应该够了吧。在规范里面如果我定义某个字段的属性是“LLVAR”,你注意了,其中的LL表示长度,VAR表示后面的数据,两个LL表示两位长,最大是99,如果是三位就是“LLLVAR”,最大是999。这样看我们定义的ISO8583规范文档时直接根据这几个字母就理解某个变长字段的意思了。

 

2. XML格式报文

XML是一种可扩张标志语言,可扩展性指允许用户按照XML规则自己定义标记(tags标签)。

语法规则:

    XML文件有且仅有一个根标记,其他标记必须封装在根标记中,文件的标记必须形成树状结构。

    大小写敏感。

    标记的属性必须用""或''括起来。

XML细节:

一、 声明

    大多数XML文档以XML声明作为开始,它向解析器提供了关于文档的基本信息。

    建议使用XML声明,但它不是必需的。如果有的话,那么它一定是文档的第一行内容。

      如:<?xml  version="1.0"  encoding="UTF-8" standalone="no"?>

    声明最多可以包含三个名称-值对(许多人称它们为属性,尽管在技术上它们并不是)。

      <?xml 问号与xml之间不能有空格。

    1)version 是使用的XML 版本:1.0, 1.1

    2)encoding 是该文档所使用的字符集。该声明中引用的ISO-8859-1 字符集包括大多数西欧语言用到的所有字符。

      默认字符在UTF-8字符集中,这是一个几乎支持世界上所有语言的字符和象形文字的Unicode 标准。

    3)standalone(可以是yes 或no)定义了是否孤立处理该文档。

      如果XML文档没有引用任何其它文件,则可以指定 standalone="yes"。

      如果XML文档引用其它描述该文档可以包含什么的文件(如DTD),则 standalone="no"。默认值为"no"


二、 标记

    左尖括号“<“和右尖括号“>“之间的文本

      1. 在<  >中的称为开始标记;在</  >中的称为结束标记

      2. 空标记:不包含元素的标记。空标签必须以“/>”结束。格式: <空标记的名称/> <空标记的名称 属性列表/>

    注意:

      除空标记外,标签必须成对:有始有终。所有的开始标签和结束标签必须匹配。

      在标记符“<“和"标记的名称"之间不能含有空格。在标记符"/>"前面可以有空格或回行。

      标签必须嵌套正确。

    XML标记必须遵循下面的命名规则:

     1.名字中可以包含字母、数字以及其它字母或文字;还可包含下划线(_)、点(.)、连字符(-)

     2.名字不能以数字开头;可以用字母、文字或者下划线开头。

     3.名字不能以字母xml (或XML 或Xml ..) 开头;

     4.名字中不能包含空格。

三、 元素

    位于开始标记与结束标记间

    一份文档有且只有一个根元素。

    根元素下的所有元素叫“子元素”。

    标签必须嵌套正确。

    不包含自子元素的元素叫“叶子”;包含子元素的元素叫“分支”。

    如: <eric>…… </eric>

五、 注释

    注释可以出现在文档的任何位置。(但不建议放在声明前面,部分浏览器会报错)

    注释以 <!-- 开始,以 -->  结束。

    注释内不能包含双连字符(--);除此之外,注释可以包含任何内容。

    注释内的任何标记都被忽略


六、 处理指令

    处理指令是为使用一段特殊代码而设计的标记,简称为PI。

    大多数XML 文档都是以XML 声明开始,该声明本身就是特殊的处理指令。

    处理指令对应用程序特定的数据进行编码。一条处理指令包含一个目标,后跟数据。用<?和?>定界符将处理指令包起来。

    目标确定应用程序,而对应用程序不能识别的目标,其会忽略这些处理指令。


七、 实体

    XML 规范预定义了五个实体。

      &lt;   ==== <

      &gt;   ==== >

      &quot; ==== ”

      &apos; ==== ‘

      &amp;  ==== &

    自定义实体:在DTD中定义 <!ENTITY 实体标志 "实体内容">

      在xml中引用自定义实体,用  &实体标志;  代表实体内容。

    另外,无法从键盘输入的字符可以使用字符引用,就是用字符的Unicode代码点来引用该字符。

      以"&#x"开始字符引用,以分号结尾,x必须为小写,使用十六进制。如: &#x003D; 表示等于号。

      也可以使用字符引用来引用 <,>,',",&  "

八、 CDATA

    当一段文本中出现很多实体引用和字符引用时,会导致文本数据的读写困难,CDATA段就是为了解决这一问题引入的。

    DATA区段开始于 "<![CDATA["  结束于  "]]>"

    CDATA内部的所有东西都会被解析器忽略解析,不用检查它的格式。

    但是CDATA段中不能嵌套另一个CDATA段。


九、 属性

    属性是标记的属性,可以为标记添加附加信息。

    (1)属性的组成

       属性是一个名值对,必须由名称和值组成,属性必须在标记的开始标记或空标记中声明,用"="为属性指定一个值。

       语法如下:

           <标记名称 属性列表/>

           <标记名称 属性列表>XXX</标记名称>

       例如: <桌子 width="40" height='100'/>

    (2)使有属性的原则

       属性不体现数据的结构,只是数据的附加信息;

       一个信息是作为一个标记的属性或子标记,取决于具体问题,不要因为属性的频繁使用破坏XML的数据结构。

       下面是一个结构清晰的XML文件:

           <楼房 height="23m" width="12m">

               <结构>混凝土</结构>

               <类别>商用</类别>

           </楼房>

      下面是一个结构不清晰的XML文件:

          <楼房 height="23m" width="12m" 结构="混凝土" 建筑商="华海集团" 类别="商用"></楼房>

、 名称空间/包

    XML文件允许自定义标记,所以可能出现同名字的标记,为了区分这些标记,就需要使用名称空间。

    名称空间的目的是有效的区分相同的标记,其实并不真实存在。

    语法: 声明有前缀的名称空间  xmlns:前缀名=名称空间的名字

          声明无前缀的名称空间  xmlns=名称空间的名字  (缺省)

    注意:当且仅当它们的名字相同时称二个名称空间相同,也就是说,对于有前缀的名称空间,如果二个名称空间的名字相同,即使前缀不相同,也是相同的名称空间,返之同然。前缀只是方便引用而已。




基本术语

    一、序言Prolog:包括XML声明(XML Declaration)和文档类型声明(Document Type Declaration)。

    二、良构(well-formed 规范的):符合W3C定义的XML文档。


验证

    为什么需要验证?

    对XML文件施加额外的约束,以便交流。


一、DTD验证

    文档类型定义(Document Type Definition)

    DTD定义了XML文档内容的结构,保证XML以一致的格式存储数据。精确的定义词汇表,对XML的内容施加约束。

    符合DTD的规范XML文档称为有效的文档。由DTD定义的词汇表以及文档语法,XML解析器可以检查XML文档内容的有效性。

    规范的XML文件不一定是有效的;有效的一定是规范的。


1、 DTD声明

    1) DTD声明可以在单独的一个文件中

    2) DTD声明可以内嵌在XML文件中

    3) DTD声明可以一部分在单独的文件中,另一部分内嵌在XML文件中


2、 引入外部DTD文件

    <!DOCTYPE data SYSTEM "Client.dtd">

    Data:根节点名称

    Client.dtd:dtd文件路径

3、 DTD四种标记声明

    元素(ELEMENT)、属性(ATTLIST)、实体(ENTITY)、符号(NOTATION)


  1) 元素(ELEMENT) XML元素类型声明

     声明元素: <!ELEMENT elementName (contentModel)>

     元素的内容通过内容模式来描述。

     DTD 内容模式的种类有:

         EMPTY   元素不能包含任何数据,但可以有属性(前提是必须声明其属性)。

                 不能有子元素。不能有文本数据(包括空白,换行符)。

                 DTD中定义: <!ELEMENT elementName EMPTY>

                 XML中:<elementName/>(推荐) 或者:<elementName></elementName>

       (#PCDATA) 规定元素只包含已析的字符数据,而不包含任何类型的子元素的内容类型。

                 DTD中定义: <!ELEMENT student (#PCDATA)>

                 XML中合法内容: <student>watching TV</student>

      (Elements) 元素由内容模式部件指定。

                 <!ELEMENT  name  (child particles) >

                 内容模式部件可以是下表列出的内容。

                    <!ELEMENT name (a,b)>  子元素a、b必须出现,且按照列表的顺序

                    <!ELEMENT name (a|b)>  选择;子元素a、b只能出现一个

                    <!ELEMENT name (a)  >  子元素a只能且必须出现一次

                    <!ELEMENT name (a)+ >  子元素a出现一次或多次

                    <!ELEMENT name (a)* >  子元素a出现任意次(包括零次、一次及多次)

                    <!ELEMENT name (a)? >  子元素a出现一次或不出现

        Mixed    混合模式:子元素中既可有文本数据又可有下级子元素。

                 <!ELEMENT rn (#PCDATA| an | en)*>“|”和“*”必须写。

                 上句表示在 rn 内,字符数据 或 en及an 可以出现任意多次,顺序不限。

                 优先写(#PCDATA)  如:(#PCDATA|name)* 正确   (name|#PCDATA)* 错误

         ANY     元素可以包含任何类型的数据。子元素(必须在DTD中有定义) 和 文本数据(包括空白)。

                 DTD中定义: <!ELEMENT a ANY> <!ELEMENT b ANY>

                 XML中合法内容: <a>somngthing</a> 或者 <a/> 或者 <a><b>oo</b></a>


   2) 属性(ATTLIST) 特定元素类型可设置的属性&属性的允许值声明

        <!ATTLIST elementName

        attributeName1 attributeType attributeDefault

        .......

        attributeNameN attributeType attributeDefault>

 .......

        attributeNameN attributeType attributeDefault>

     属性类型 (Attribute Type):

        CDATA该属性只能包含字符数据(注意与CDATA段、PCDATA的区别)

        NMTOKEN  是CDATA的子集,它的字符只能是字母,数字,句点,破折号,下划线或冒号。

        NMTOKENS 类似NMTOKEN,但这个可以包含多个值,每个值之间用空格隔开。

        ID       该属性的取值在同一文档内是唯一的。一个元素只能有一个ID类型的属性。

        IDREF    类似指针,指向文档中其他地方声明的ID值。如果该属性取值和指向的ID值不匹配,则返回错误。

        IDREFS   类似IDREF,但它可以具有由空格分隔开的多个引用。

        ENTITY   该属性的值必须对应一个在文档内部声明的但还没有分析过的实体。

        ENTITYS  类似ENTITY,但它可以包含由空格分隔开的多个实体。

        NOTATION 该属性的值必须引用在文档中其他地方声明的某个注释的名称。

        (enumerated) 类似枚举的变量,该属性必须匹配所列的值。各值用“|”分隔开。

                 如: (春|夏|秋|冬) 实际内容文档只能从中取一个。

     属性特性 (Attribute Default) :

        #REQUIRED   必须有且只能有一个属性。

        #IMPLIED    可有可无。

        #FIXED      在DTD中定义默认值,XML中可以不指定,指定则必须等于该默认值。

        attribute-value 如果不指定则用DTD定义的默认值,指定则用指定的值。

<![CDATA[############ 属性(ATTLIST)的举例 ############## ]]>

例一(#REQUIRED)

    DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at1 NMTOKENS #REQUIRED  at2 CDATA #REQUIRED>

    XML中,正确: <el at1 = "10 20" at2="10" >something</el>

    XML中,错误: <el at="10">something</el>  (没有写另一个#REQUIRED的属性 at2 )


例二(#IMPLIED,#FIXED)

    DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA #FIXED "10"  at2 CDATA #IMPLIED >

    XML中,正确: <el at2="20" >something</el> (at有默认值"10",at2 可写可不写)

    XML中,错误: <el at="11" >something</el>(at要么不写,要写只能写成跟默认值相同的)


例三(attribute-value)

    DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA "10" at2 CDATA "20" >

    XML中,正确: <el at="11" >something</el>


例四(enumerated + attribute-value)

    DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at (10|20|30) "10">

    XML中,正确: <el at="20">something</el>  (at要么不写,默认值 10;要么在(10|20|30)中选一个写)

<![CDATA[############ 属性(ATTLIST)举例 完毕 ############## ]]>


  3) 实体(ENTITY)   可重用的内容声明

     在DTD中定义 <!ENTITY 实体标志 "实体内容">

     在xml中引用自定义的实体,用  &实体标志;  代表实体内容。

      4) 符号(NOTATION) 不要解析的外部内容的格式声明。



3、 内部实体:在xml文件里面写(少用)

    外部实体:另外在xml同一文件夹下建立一个dtd文件(提倡)

<!--**************** 内外部的实体举例 ***************** -->

外部的:

      <?xml  version="1.0"  encoding="UTF-8" standalone="no"?>

      <!DOCTYPE root SYSTEM "goodsInfo.dtd"><!--用这句引用外部dtd-->

      <root><goodsInfo>

          <goodsName>goodsName</goodsName>

          <goodsPrice>goodsPrice</goodsPrice>

      </goodsInfo></root>

 以下是名为"goodsInfo.dtd"文件
      <!ELEMENT root   (goodsInfo)>
      <!ELEMENT goodsInfo  (goodsName,goodsPrice)>
      <!ELEMENT goodsName  (#PCDATA)>
      <!ELEMENT goodsPrice (#PCDATA)>

内部的:
      <?xml  version="1.0"?>
      <!DOCTYPE root [
          <!ELEMENT root(student)>
          <!ELEMENT student (#PCDATA)>
          <!ENTITY CCTV  "中央电视台">
      ]>  <!--把DTD文件写在体内-->
      <root><student>
          student watch &CCTV;<!--使用自定义实体 CCTV-->
      </student></root>
<!--***************** 内外部的实体举例 完毕 ********************** -->


XML处理模式
一、 DOM 文档对象模式
    1.DOM特点:
      以树型结构访问XML文档。 一棵DOM树包含全部元素节点和文本节点。可以前后遍历树中的每一个节点。
      整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能。
      将整个文档调入内存(包括无用的节点),浪费时间和空间。
      一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)情况下使用。
    2.DOM树与节点
      XML文档被解析成树型结构。
      树由节点组成。共有12种不同的节点。
      节点可以包含其他节点(依赖于节点的类型)。
      父节点包含子节点。叶子节点没有子节点。
    3.节点类型
      Document node   包含:一个根Element节点。一个或多个处理指令节点。
      Document Fragment node
      Element node包含:其他Element节点。若干个Text节点。若干个Attribute节点。
      Attribute node  包含:一个Text节点。
Text node
      Comment node
      Processing instruction node
      Document type node
      Entity node
      Entity reference node
      CDATA section node
      Notation node
 
3. HTTP协议报文基本格式
 
HTTP协议(Hypertext Transfer Protocol――超文本传输协议),浏览器端(客户端)向WEB服务器端访问页面的过程和HTTP协议报文的格式。

注:Ascii码:回车=0x0D('\r'), 换行=0x0A('\n').

    基于HTTP协议的客户机访问包括4个过程,分别是建立TCP套接字连接、发送HTTP请求报文、接收HTTP应答报文和关闭TCP套接字连接,HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
建立连接:
连接的建立是通过申请套接字(Socket)实现的。客户打开一个套接字并把它约束在一个端口上,如果成功,就相当于建立了一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。通俗地说就是TCP的三次握手
发送请求:
首先,这个消息是用普通的ASCII文本书写的。这个消息共有多行(每行以一个回车符和一个换行符结束),最后一行后面还有额外的一个回车符和换行符。当然,一个请求消息也可以仅仅只有一行。请求的报文中包含了各种信息,包括客户端想要访问的URL,HTTP的版本,支持的浏览的字体等内容。详细分析见2.2.1请求报文字段
发送响应 :           
服务器在处理完客户的请求之后,要向客户机发送响应消息。
 这个响应消息分为3部分:1个起始的状态行(status line),6个头部行(不固定)、1个包含所请求对象本身的附属体。状态行有3个字段:协议版本字段、状态码字段、原因短语字段。
关闭连接:
 客户和服务器双方都可以通过关闭套接字来结束TCP/IP对话。通俗地说就是TCP的4次握手断开。常见的应用环境就是这样,实际生活中可能就是多了一个NAT转换,其实过程都是一样的。

1. 创建TCP套接字连接
    客户端与WEB服务器创建TCP套接字连接,其中WEB端服务器的地址可以通过域名解析确定,WEB端的套接字侦听端口一般是80。
2. 发送HTTP请求报文
    客户端向WEB服务端发送请求报文,HTTP协议的请求报文格式为:
请求消息 = 请求行(实体头信息)CRLF[实体内容]请求行 = 方法 URL HTTP版本号 CRLF方法 = GET|HEAD|POST|扩展方法URL = 协议名称 + 宿主名 + 目录与文件名

    其中"CRLF"表示回车换行。
    "请求行"中的"方法"描述了对指定资源执行的动作,常用的方法"GET"、"HEAD"和"POST"等3种,它们的含义如表15-8所示:
表15-8 HTTP请求方法
取值
描述
GET
WEB服务器中获取对象,不同类型的对
象将获取不同的信息,比如:
· 文件类型对象,获取该文件的内容。
· 程序类型对象,获取该程序执行的结果。
· 数据库查询类型对象,获取该查询的结果。
HEAD
要求服务器查找对象的元信息。
POST
从客户端向WEB服务器发送数据。

    "实体头信息"中记载了报文的属性,利用这些信息可以实现客户端与WEB服务器之间的请求或应答,它包括报文的数据类型、压缩方法、语言、长度、压缩方法、最后一次修改时间、数据有效期等信息。
    实体内容是报文传送的附加信息,一般供POST请求填写。

GET请求报文例子
    一个URL为"http://www.zhiliaowang.com/toupiaoceshi.asp?name=朱云翔"的GET请求报文例子如下:
GET http://www.zhiliaowang.com/toupiaoceshi.asp?name=朱云翔 HTTP/1.1Accept: */*Accept-Language: zh-cnAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)Host: www.zhiliaowang.comConnection: Keep-Alive
    其中"/toupiaoceshi.asp?name=朱云翔"是URL信息,语句"ACCEPT:*/*"及其后的语句是"实体头信息"。
    注意:在语句"Connection:Keep-Alive"下的空行是必须的。

POST请求报文例子
    下面是HTTP协议中关于POST请求报文例子,节自《中国联合通信公司短消息网关系统接口协议(SGIP)》V1.2版:
POST /sp.cgi HTTP/1.0     /* 请求行,服务程序为sp.cgi */Host: www.spserver.com     /* 以下为实体头信息 */Authorization: Basic <Base64 串>Content-Length: <Content-Length>
<CommandId>=<4>       /* 以下为POST请求的实体信息 */<SequenceNumber>=<205502327125025327> /* 实体部分输送报文 */<UserNumber>=<8613001125453><SPNumber>=<168><MessageContent>=<ABCD 1234>


    一般情况下,采用POST报文传送信息的数据存储在"实体"部分中。

请求报文附注:
    HTTP请求包括三部分:请求行(Request Line),头部(Headers)和数据体(Body)。其中,请求行由请求方法(method),请求网址Request-URI和协议 (Protocol)构成,而请求头包括多个属性,数据体则可以被认为是附加在请求之后的文本或二进制文件。

    下面这个例子显示了一个HTTP请求的Header内容,这些数据是真正以网络HTTP协议从IE浏览器传递到Apache服务器上的。
GET /qingdao.html HTTP/1.1
Accept:text/html, */*
Accept-Language:zh-cn
Accept-Encoding:gzip,deflate
User-Agent:Mozilla/4.0(compatible;MSIE 5.01;Windows NT 5.0;DigExt)
Host: www.6book.net
Referer: http://www.6book.net/beijing.html
Connection:Keep-Alive

    这段程序使用了6个Header,还有一些Header没有出现。我们参考这个例子具体解释HTTP请求格式。
1.HTTP请求行:请求行格式为Method Request-URI Protocol。在上面这个例子里,"GET / HTTP/1.1"是请求行。
2.Accept:指浏览器或其他客户可以接爱的MIME文件格式。可以根据它判断并返回适当的文件格式。
3.Accept-Charset:指出浏览器可以接受的字符编码。英文浏览器的默认值是ISO-8859-1.
4.Accept-Language:指出浏览器可以接受的语言种类,如en或en-us,指英语。
5.Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式。
6.Authorization:当使用密码机制时用来标识浏览器。
7.Cache-Control:设置关于请求被代理服务器存储的相关选项。一般用不到。
8.Connection:用来告诉服务器是否可以维持固定的HTTP连接。HTTP/1.1使用Keep-Alive为默认值,这样,当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都建立连接。
9.Content-Type:用来表名request的内容类型。可以用HttpServletRequest的getContentType()方法取得。
10.Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。
11.Expect:表时客户预期的响应状态。
12.From:给出客户端HTTP请求负责人的email地址。
13.Host:对应网址URL中的Web名称和端口号。
14.If-Match:供PUT方法使用。
15.If-Modified-Since:客户使用这个属性表明它只需要在指定日期之后更改过的网页。因为浏览器可以使用其存储的文件而不必从服务器请求,这样节省了Web资源。由于Servlet是动态生成的网页,一般不需要使用这个属性。
16.If-None-Match:和If-Match相反的操作,供PUT方法使用。
17.If-Unmodified-Since:和If-Match-Since相反。
18.Pragma:这个属性只有一种值,即Pragma:no-cache,表明如果servlet充当代理服务器,即使其有已经存储的网页,也要将请求传递给目的服务器。
19.Proxy-Authorization:代理服务器使用这个属性,一般用不到。
20.Range:如果客户有部分网页,这个属性可以请求剩余部分。
21.Referer:表明产生请求的网页URL。
比如从网页/beijing.html中点击一个链接到网页/qingdao.html,在向服务器发送的GET /beijing.html中的请求中,Referer是
http://www.6book.net/qingdao.html 。这个属性可以用来跟踪Web请求是从什么网站来的。
22.Upgrage:客户通过这个属性设定可以使用与HTTP/1.1不同的协议。
23.User-Agent:是客户浏览器名称。
24.Via:用来记录Web请求经过的代理服务器或Web通道。

25.Warning:用来由客户声明传递或存储(cache)错误。

3. 接收HTTP应答报文
    WEB服务器处理客户请求,并向客户机发送应答报文,HTTP协议的应答报文格式为:
    应答报文 = 状态行(实体头信息)CRLF [实体内容]
    状态行   = HTTP版本号 状态码 原因叙述
    状态码描述了WEB服务器执行客户机请求的状态信息,其取值含义如表15-8所示:
表15-8 HTTP应答响应码含义
取值
描述
1××
保留。
2××
成功接收,比如“200”表示处理成功。
3××
客户需进一步细化请求。
4××
客户错误,比如“404”表示访问的
指定资源不存在。
5××
服务器错误。

GET应答报文例子
    一个请求URL为"http://www.zhiliaowang.com/toupiaoceshi.asp?name=朱云翔"的应答报文例子如下:
HTTP/1.1 200 OKConnection: keep-aliveDate: Thu, 26 Jul 2007 14:00:02 GMTServer: Microsoft-IIS/6.0X-Powered-By: ASP.NETContent-Length: 190Content-Type: text/htmlSet-Cookie: ASPSESSIONIDSAATTCSQ=JOPPKDCAMHHBEOICJPGPBJOB; path=/Cache-control: private
<html><head><title>精通Unix下C语言编程</title></head><body><b>精通Unix下C语言编程与项目实战<br></b><b>投票测试<br></b>感谢你为选手朱云翔投票!</body></html>
    语句"HTTP/1.1 200 OK"中,"200"是响应码,"OK"是原因描述。
POST应答报文例子
    下面是HTTP协议中关于POST应答报文例子,节自《中国联合通信公司短消息网关系统接口协议(SGIP)》V1.2版:
HTTP/1.0 200 OK       /* 状态行,应答成功 */Date: Tue, 13 Mar 2001 02:45:12 GMT /* 以下为实体头信息 */Server: Apache/1.3.12 (Unix)Content-Type: text/htmlConnection: close
<CommandId>=<80000004>     /* 以下为POST应答的实体信息 */
<SequenceNumber>=<205502327125025327>
<UserNumber>=<8613001125453>
<SPNumber>=<168>
<MessageContent>=< EFGH 5678> <Result>=<0>
    一般情况下,POST应答报文的"实体"部分存储实际传输的信息。
4. 关闭TCP套接字连接

     客户机与服务器双方关闭套接字连接,结束TCP/IP对话。

原创粉丝点击