`
tianshibaijia
  • 浏览: 1126900 次
文章分类
社区版块
存档分类
最新评论

再谈Http协议中消息的编码

 
阅读更多

以前大概知道URLencoded, application/x-www-form-urlencoded等大概的东西,也做了一些能运行的程序,可总归不是特别清楚。今天又看到了HTTP: The Definitive Guide这本电子书,终于彻底明白了怎么回事。

首先还是回顾一下HTTP协议的报文,Http协议报文有两种,一是请求报文,二是响应报文,而这两种报文格式和编码规则是一样的,所以这里以请求报文为例。

请求报文(消息),由三个部分组成,从前到后分别是:

(1)start line

(2)headers

(3)body

好了,首先要明确的是(1)和(2)必须是ASCII码字符,也就是说出现在(1)和(2)里的字符编码必须为0-127之内。(3)中的内容可以是任何编码,可以是字符编码,也可以是图像的编码,也可以是任意二进制编码。至于到底里面是什么,通过(2)中的 Content-Type:头来说明。

总体格式是这样的,(1)startline必须以CRLF结尾,CR,LF当然也是ASCII码了。(2)headers也必须以CRLF结尾。需要注意的是,即使一个头也没有,仍需要一个CRLF表示头的结束。

具体来说:

一、对于startline

method request-URL version CRLF,其中method为方法名,如GET,POST等,后跟空格,后跟请求的URL,后跟空格,后跟版本号,后跟CRLF。

这里需要注意的是URL的编码,前面已经讲过了,首先startline里的内容必须为ASCII码,而对于startline里面的URL则更为苛刻,URL的格式为http://hostname:port/p1/p2/resource,其中://为固定编码,/用来分隔路径,:用来指定端口号,resource指定资源名,p1,p2是路径名。URL的苛刻要求在于,hostname,p1,p2,resource的名称必须限定于ASCII码的一个子集,见下表:

Unreserved

[A-Za-z0-9] | "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"

Reserved

";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","

Escape

"%" <HEX> <HEX>

其中Reserved一行中的ASCII码不允许出现在hostname,p1,p2,resource中,可要是确实需要这些字符怎么办呢,此时就需要通过称为URLEncode的方法对不允许出现的字符进行编码为允许的字符,例如本来resource的名字为~voice,那么编码后就变成了%7Evoice,其中7E为~字符的ASCII码的十六进制的ASCII表示。原则上这种方式只能编码Reserved的ASCII码,而现在人们扩展了这种方法,也利用这种方法编码复杂字符,如GB2312和UTF-8等,如把GB2312的“好人”编码为%BA%C3%C8%CB,把UTF-8的"好人"编码为%E5%A5%BD%E4%BA%BA,虽然这不规范但已经成了实事上的标准了。

二、对于headers

标头的具体格式如下蓝色所示:name: valueCRLF 其中,name为标头表示变量的名字,后跟冒号,后跟一个可选的空格,后跟变量的值,后跟CRLF。

三、对于body

body里是什么内容,如果是字符采用什么编码,如果是图像又采用什么格式,所有这些都是有headers里规定的。其中Content-Type规定了body里面是什么,采用什么编码,如Content-Type: text/html; charset=UTF-8,表示body里的内容是html文件,采用UTF-8编码。这里需要注意的是对于:Content-Type: application/x-www-form-urlencoded,这是POST常用的消息类型,它表明body里放的是表单数据,采用的编码为urlencoded。首先,这种格式的body内容必须为ASCII码,除了格式化字符自身外,其他字符必须限定于ASCII的unreserved子集。举例来说,这种body的格式为name1=value1&name2=value2&name3=&name4=value4,name1,name2,name3,name4为变量名,value1,value2,value3,value4为变量的值,=和&为格式化字符。这里要求name1,name2,name3,name4,value1,value2,value4的编码必须为ASCII的UnReserved子集。

对编程的提示:

仅仅对需要URLEncode的地方进行编码,不要全部进行编码。如GET http://www.baidu.com/s?wd=~testCRLF

(1)首先确定URL的部分,不是URL的部分根本不能进行URLencode编码。显然URL部分是http://www.baidu.com/s?wd=~test。对于GET,空格,CRLF三部分不属于URL,不能进行特殊编码。

(2)确定URL部分需要URLEncoded的地方。需要进行RULEncode的只是www.baidu.com,s,wd,~test。尽管www.baidu.com,s,wd编码前后不变但它们也是需要编码的部分。而对于http://,:,/,?,=,它们本身是格式化字符,具有特殊意义不能再进行URLencode编码了。

所以startline可以这样生成:

string startline = "GET " + "http://" + URLEncode(www.baidu.com) + "/" + URLEncode("s") + "?" + URLEncode("wd") + "=" + URLEncode("~test") + "/r/n";

千万别写成了

string startline = URLEncode("GET http://www.baidu.com/s?wd=~test/r/n");

也不要写成

string startline = "GET " + URLEncode("htt://www.baidu.com/s?wd=~test") + "/r/n";

分享到:
评论

相关推荐

    java串口通讯 短信测试 comm编程 PDU编码 进制转换 AT命令

    13751069146 Saro Modem 短信测试.txt Java Comm API编程指南.doc Javax.comm简介.doc KEIL中如何用虚拟串口调试...浅谈Java串行端口技术协议.doc 短信 AT 命令参考.doc 短信PDU编码解码.doc 通过串口收发短消息.doc

    MQ服务消息队列介绍

    MQ服务器端和客户端通信浅谈 1. WebSphere MQ的服务端的安装和配置 (1)创建名为venus.queue.manager的默认队列管理器。 在DOS窗口命令提示符下,输入以下命令: crtmqm -q venus.queue.manager (2)启动...

    Windows应用程序捆绑核心编程光盘代码

    第1章 再谈计算机内存访问 1 1.1 引言 1 1.2 内存管理概述 1 1.2.1 虚拟内存 1 1.2.2 CPU工作模式 2 1.2.3 逻辑、线性和物理地址 3 1.2.4 存储器分页管理机制 3 1.2.5 线性地址到物理地址的转换 4 1.3 虚拟...

    MPEG-2_TS流ETR290测试浅谈.doc

    数字电视码流的监测,数字码流根据来源分为:编码器输出的TS流、数字卫星接收机输出TS流、多洗衣适配器输出的TS流、复用器输出的TS流、独立加扰器输出的TS流、其他TS流、QAM调制解调后TS流。对于数字的码流分析,...

    通信与网络中的浅谈HSDPA流量和覆盖的情况

    技术针对用户高速下行数据业务的要求,基于链路自适应调制技术和混合ARQ技术来获得更高的流量和高峰值速率、减少传输等待时间。...在具体实现中,采用了自适应调制和编码(AMC)、多输入多输出(MIMO

    浅谈Express.js解析Post数据类型的正确姿势

    2、 Content-Type : 是指 http/https 发送信息至服务器时的内容编码类型, Content-Type 用于表明发送数据流的类型,服务器根据编码类型使用特定的解析方式,获取数据流中的数据。四种常见的 POST 请求的 Content-...

    浅谈HSDPA流量和覆盖的情况

    技术针对用户高速下行数据业务的要求,基于链路自适应调制技术和混合ARQ技术来获得更高的流量和高峰值速率、减少传输等待时间。...在具体实现中,采用了自适应调制和编码(AMC)、多输入多输出(MIMO

    VB网络编程实例

    ◆ 176.htm 你也可以YAI--VB5中Winsock控件的使用 ◆ 177.htm 判断一个文件是否在IE的缓存中 ◆ 178.htm 启动拨号网络中的连接 ◆ 179.htm 浅谈HTTP协议(二)--返回值 ◆ 180.htm 浅谈...

    工业电子中的浅谈“全球眼”视频监控的新技术和应用

    视频监控是安全防范系统的重要组成部分,它是一种防范能力较强...信息流的数字化、编码压缩、开放式的协议,使智能网络视频监控系统与安防系统中的各个子系统间实现无缝连接,并在统一的操作平台上实现管理和控制,这就

    锐捷java笔试题-SoftwareReuseSeminar:软件重用研讨会

    锐捷java笔试题 软件复用——谈复用解决方案 长连接心跳机制 ######使用netty来达到实现Client与Server的长...与其他的编码协议如xml,json相比,protobuf有着更好的传输效率和压缩比率。原生的protobuf包括两部分内容

    浅谈低压电力线载波通信研究方案

    摘 要: 针对基于低压电力线网络通信信道编码技术进行探讨与研究,并通过协议的编制以实现通信。在实际信道传输数字信号时,由于信道的传输特性不理想及加性噪声的影响,接收的信号不可避免地会发生错误。通过对...

    安全:Web安全学习笔记

    浏览器和服务器的通信采用无状态的HTTP协议。通过控制HTTP的请求头,可以控制:客户端缓存、Cookie、请求编码、相应编码等。请求内容向服务器提交数据(POST和GET),响应内容向浏览器发送数据。Cookie包含在每个...

    asp.net知识库

    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...

    浅谈3G无线视频监控服务器

    1 引言  视频监控是安全防范系统的重要组成部分,它是一种防范能力较强的...信息流的数字化、编码压缩、开放式的协议,使智能网络视频监控系统与安防系统中的各个子系统间实现无缝连接,并在统一的操作平台上实现管

    CEN/XFS MIB SDK

    也就是ATM上每个需要监控的设备信息都在MIB中唯一的编码了,这种 编码叫做OID(Object Identifier)。例如对于读卡器Online状态有个OID的编码,通过该编码就知道读卡器的状态了,并且该编码是全球唯一的一串数字。

    浅谈“眼”视频监控的新技术和应用

    视频监控是安全防范系统的重要组成部分,它是一种防范能力较强...信息流的数字化、编码压缩、开放式的协议,使智能网络视频监控系统与安防系统中的各个子系统间实现无缝连接,并在统一的操作平台上实现管理和控制,这就

    浅谈遥控模块的使用说明 电动窗遥控模块功能详解

    遥控模块的使用模块必须用信号调制才能正常工作,常见的固定码编码器件如PT2262/2272,只要直接连接即可,非常简单,因为是专用编码芯片,所以效果很好传输距离很远。模块还有一种重要的用途就是配合单片机来实现...

    .NET之美:.NET关键技术深入分析

    10.4.1 ASCIl、UTF8、Unicode编码下的中英文字符大小 10.4.2文本边界问题 10.5异步传输字符串 10.5.1 服务端的实现 10.5.2客户端的实现 10.5.3程序测试 10.6文件传输 10.6.1订立协议 10.6.2协议处理类的实现...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 其他详细信息查看:http://www.china-pub.com/196571 ...12.3.1 重温上节中的程序 349...

Global site tag (gtag.js) - Google Analytics