记一次HTTP 服务实战

1.       引子

今日来,由于手机终端需要通过CMWAP HTTP访问服务器,服务器这边必须解析HTTP请求,并且进行协议解析,进行业务操作,将结果反馈至手机终端。

 记一次HTTP 服务实战_第1张图片

由于手机终端机遇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已经结束;余下可以进行从socketread 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";

你可能感兴趣的:(windows,header,服务器,Firebug,手机,终端)