天天看点

关于手机在wap网络下的 HTTP 请求方式

之前在做一个android 程序,发现在客户端请求web平台数据总是不通,后来发现这台手机竟然是wap网络,更发现无论是移动,联通和电信都有这个问题。之前一直没明白wap网络和net网络有什么区别,一番考证以后终于了解。可是要怎么解决呢?平时习惯了用谷歌大神去搜索,可是该死的wap网络只在天朝中才有,国外的一般都是net网络了,无奈在资料不多的度娘上爬了半天,再加自己的一点摸索考证,终于搞定,现在分享出来,不敢独享!罪过,罪过!

至于大家多wap和net网络的理解,我就不在这解释更多了。度娘等着您呢!

我们在请求 http 数据的时候,一般使用 HttpURLConnection 或者 HttpClient ,在请求webservice的时候,习惯使用 KSoap。在net网络下使用毫无压力,但是遇到了该死的wap网络,却发现怎么都是抛异常,实属无奈呀!

众所周知,在国内的GPRS网络环境下,用户以cmwap接入点上网的情况居多。cmwap是中国移动的GPRS代理上网,因此在创建连接的时候,必须采用代理的方式进行连接。

假设我连接的URL为:http://wap.uc.cn/;

在标准代理中,是这样子的:

Conection to 10.0.0.172:80

GET http://wap.uc.cn/ HTTP/1.1

Host: wap.uc.cn

但是在J2ME中,实际在android中也是一样的。程序并不能控制到TCP层,因此中国移动定义了一个私有协议字段:X-Online-Host。从移动要求的规范来看,我们只需要这样设置即可正常进行联网:

Conection to 10.0.0.172:80

GET / HTTP/1.1

Host: 10.0.0.172

X-Online-Host: wap.uc.cn

实际上对于程序来说,我们只需要将原来连接的url及http header中的host替换成10.0.0.172,并添加一个http header字段:X-Online-Host,值为原来的host。然后继续采用直连的方式即可正常进行联网。

如果你的手机是电信的,且当前网络为wap的时候

只需要简单的设置上网关即可,

java.net.Proxy p = null;
p = new java.net.Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress(“10.0.0.200”,“80”));
URLConnection conn = url.openConnection(proxy);
           

然而,当你遇到中国移动和中国联通的时候,如果判断当前网络又为wap的时候,那就麻烦一点了

1、需要加上网关,即需要先设置代理

例如:

java.net.Proxy p = null;
p = new java.net.Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress(“10.0.0.172”,“80”));
URLConnection conn = url.openConnection(proxy);
           

2、假设我连接的URL为:http://wap.uc.cn

   需要把原来的url替换为 :http://10.0.0.172

   紧接着在请求头中,加上两个字段,分别为:

   X-Online-Host: wap.uc.cn

   Accept:*/*

这样按照以上两步,提交请求就大功搞成了。至于为什么不懂“10.0.0.200”和“10.0.0.172”哪儿来的,自己就又度娘一下吧。

另外说明一下,那些一直出现

java.net.ConnectException: localhost/127.0.0.1 等错误,就是因为没有按照上面两步骤来的。出现的童鞋好好

解决一下吧

继续阅读