1. 引子
今日来,由于手机终端需要通过CMWAP HTTP访问服务器,服务器这边必须解析HTTP请求,并且进行协议解析,进行业务操作,将结果反馈至手机终端。
由于手机终端机遇WTK,采用HttpConnection,故服务器必须能够读取http request body中的信息进行协议解析;
2. 解析Request
下面是从firebug中抓取的一段带有普通的HTTP Request Head:
GET / HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)
Host: 192.168.0.171:10000
Connection: Keep-Alive
/r/n
//request body(optional)
行尾分别以/r/n换行;因为此时服务器设计是将具体请求的数据设置在request body中传,所以头信息必须过滤掉(和我们一般的服务器做法不同,如get /a.html决定了客户端访问地址);
过滤代码如下:
for(int i=0;i<512;i++)
{
data[i]=(byte)in.read();
if(data[i]==10&&data[i-1]==13&&data[i-2]==10&&data[i-3]==13)
break;
}
如果遇到/r/n/r/n的话,则表示HTTP HEAD已经结束;余下可以进行从socket中read request body数据,并且按照协议进行解析,并且进行业务操作;
3. 发送reponse
下面是一次普通的HTTP RESPONSE HEAD:
Host:www.baidu.com
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language:zh-cn,zh;q=0.5
Accept-Encoding:gzip,deflate
Accept-Charset:GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:300
Proxy-Connection:keep-alive
Cookie:BAIDUID=BC8C811EBFC5CC76C21CD9C6FADA3090:FG=1
Response header中有一个头属性为content-length:,如果设置为0,在浏览器中访问相对没有问题,但是在手机终端中,终端接收到移动网关放回的response not full的反馈,这是其中出现的一个插曲;
服务器反馈的数据,防止在response body中反馈,但是之前必须response header,下面是一个简单的header,表示了response body中的数据的字节长度以及服务器响应结果;
String header = "HTTP/1.1 200 OK/r/n" + "Content-Length: %d/r/n"
+ "/r/n";