在做一个安卓客户端应用,跟后台通信使用HTTP,GET方式,服务器传回JSON文本给客户端。如下是通信部分的代码://...
try
{
URL url = new URL("http://khd.azyxdq.com/detail.asp");
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setUseCaches(false);
conn.setDoOutput(false);
conn.setDoInput(true);
conn.setRequestProperty("id", Long.toString(id));

int responseCode = conn.getResponseCode();
responseMsg = conn.getResponseMessage();
ins = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(ins);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int c;
while (-1 != (c = bis.read()))
{
baos.write(c);
}
bis.close();
ins.close();
baos.flush();
byte[] data = baos.toByteArray();
responseMsg = new String(data);

JSONObject jsn = new JSONObject(responseMsg);
//...对JSON作解析
}
catch (Exception ex)
{
Log.e("JSONTEST", ex.getMessage());
//...以下略

很奇怪:通过在“responseMsg = new String(data);”这句处设断点,可以看到返回的文本并不是JSON编码的字符串而是一堆HTML;而当我把“http://khd.azyxdq.com/detail.asp?id=85689”这样的URL在Opera里输入后,浏览器却能显示出正确的回复文本。
为什么手机上看到的跟Opera不一样?服务器并没对不同客户端作分别处理,有什么可能的原因?

解决方案 »

  1.   

    这种问题一般用网络协议抓包工具来分析请求的数据包有什么区别,比如说user agent等
      

  2.   

    已经解决了。一个低级错误,确实是发送的请求不对:参数本应是写在URL里形如?x=y&m=n这样的,我怎么会写在请求头里了……
    问题虽小也分享一下经验吧:调试的办法确实是像沙发所说,通过比较浏览器发的请求包和手机发的请求包有什么不同。PC上的抓包工具不多说,多得是;ANDROID手机上则是用tcpdump在shell里运行,网上可以搜到相关资料就不赘述。主要是在怎么让tcpdump获取所需的ROOT权限上费了半天功夫:原来在手机的/system/app/文件夹下有个Superuser.apk是用来设置权限的,我是用adb pull /system/app/Superuser.apk导出到PC上再安装到手机里,运行,然后在shell里试图调用su指令时在手机上就会询问是否允许其获取权限,选允许,然后就可以在shell中得到超级用户权限,就可以使用tcpdump抓包了,抓包后获取到的.pcap文件在Wireshark中打开查看,OK。