这几天做一个资讯请求功能,服务器端要求的请求头信息如下:
POST /DataxmlHelper.asmx HTTP/1.1
Host: cmsapi3.eastmoney.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: http://tempuri.org/Get_Channel_News_Page
本人做的请求代码如下:
conn = (HttpConnection) Connector.open(url, Connector.READ_WRITE, true);
conn.setRequestMethod(HttpConnection.POST);
/**
以下代码设置头信息
*/
conn.setRequestProperty("Host", "cmsapi3.eastmoney.com");
conn.setRequestProperty("Content-Length", String.valueOf(request.length));
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestProperty("SOAPAction", soapActionString);
os = conn.openOutputStream();
os.write(request);
if (conn.getResponseCode() == 200) {
is = conn.openInputStream();
isr = new InputStreamReader(is, "UTF-8");
int ic;
while ((ic = isr.read()) != -1) {
line.append((char) ic);
}
在除了c300以外的所有机型上都能正常工作,但是c300得到的响应码却是400。一直找不到bug在什么地方。
解决的方案如下:
首先判断的是通信代码没有问题(主要是大部分手机都能正常工作),那么问题应该出在c300这款机器上,我把所有的请求信息都打印出来,但是不能得到任何异常。
然后想通过让电脑使用手机上网的方式,通过在电脑上抓包,来分析数据,但是一直没有成功的设置(电脑使用手机上网配置没有成功,有成功配置的朋友,可以讲解一下)。
最后就找到服务器端,希望通过服务器那边抓包。但是服务器那边太不给力了,说得不到请求数据。让我一点办法都没有,你说得不到数据,那就是我的url错误了,但是url是正常的啊。
实在是没有办法了,我只好删除代码,一行一行的删除,最后删除到conn.setRequestProperty("Host", "cmsapi3.eastmoney.com");的时候,妈逼的,正常了,真的正常了。
后来我通过对模拟器抓包,发现即使不设置conn.setRequestProperty("Host", "cmsapi3.eastmoney.com"),在请求的头里面,也会有信息:Host: cmsapi3.eastmoney.com。
底层的实现没有兴趣去查,所以也就不知道具体原因了,但是以后在设置Host头信息的时候,要谨慎。坑爹啊!
原文链接:艰难的bug
http://www.pocketcn.com/forum-viewthread-tid-2532-fromuid-1477.html