我要用httpclient获取一个返回json的页面,但是用httpclient获取的时候总是返回302,但我在浏览器上直接输入url的时候,能正确提示下载json文件,下载后也确实就是需要的json文件。而且我用ff的时候也可以看到json,ff完整的返回内容如下:请求的网址:
http://10.1.1.12/action/quertyInfo请求的方法:
POST状态码:
HTTP/1.1200OK请求头
User-Agent:Mozilla/5.0(WindowsNT6.1;WOW64;rv:19.0)Gecko/20100101Firefox/19.0
Referer:...............
Pragma:no-cache
Host:.....................
Content-Type:application/x-www-form-urlencoded;charset=UTF-8
Connection:keep-alive
Cache-Control:no-cache
Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding:gzip,deflate
Accept:application/json,text/javascript,*/*
Content-Length:107请求主体
_search=true&cd=1361009601431响应头
X-Powered-By:Servlet/2.5JSP/2.1Date:Sat,16Feb201310:13:00GMTContent-Type:text/json;charset=utf-8Content-Length:3402Content-Language:zh响应主体
{"curPageNo":1,"dataRows":[{"PK":"19",FJ,","cbis":0,"dc":"","cfdaf":0,"ckeyf":0,"tz":"1"..................,
可是我用httpclient获取json数据时总是提示result:HTTP/1.1 302 Moved Temporarily 我也按照ff提示,写入了所有的header内容以及相关提交参数,
可是我用httpclient测试了很久还不行,不知道哪里错了
代码如下基本思路就是提交以后,获取content但是发现content并没有json信息代码如下:
HttpPost httpost = new HttpPost(url);
httpost.setHeader("User-Agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
httpost.setHeader("Accept", "application/json, text/javascript, */*");
httpost.setHeader("Content-Type",
"application/x-www-form-urlencoded; charset=UTF-8");
.............................................
....................................
...................
InputStream is = he.getContent();
InputStreamReader isr = new InputStreamReader(is, chartBM);
BufferedReader br = new BufferedReader(isr);
String line = br.readLine(); while (line != null) { sb.append(line);
line = br.readLine();
}  不知道怎么能获取json信息?

解决方案 »

  1.   

    HTTP/1.1 302 Moved Temporarily 这说明服务器返回了 response.sendRedirect(xxooo);对于浏览器来说,会自动重定向;对于你的程序而言,需要你自己根据返回信息的重定向目标去做跳转了。
      

  2.   


    这些资料我也查看了啊。但其实我这个请求时请求一个方法,我用ff和抓包工具看返回的包也没有说迁移的问题啊。我上面也把ff的信息复制下来了啊。确实没有302的概念啊。
    我就是在ff里面看到这个连接返回了json信息,我才抓的,结果我一抓却提示302,2天了都没有解决啊。
    希望您能帮我下啊
      

  3.   


    程序里面先按照302进行跳转,然后看看跳转后页面中是否有提示什么 错误信息。确实不排除是因为HttpClient中提交的信息缺失、甚至是缺少JSessionID(当涉及登录),才导致的302。但你目前手里就仅有这个302信息,不足以继续分析问题,所以需要设法获取点更多的信息。
    另外就是POST组装的数据包是否正确,一种测试方式是,你自己编写一个Servlet,就负责显示出所有的提交信息,然后你先对自己所写的这个Servlet进行POST测试,对比信息是否跟 FireFox 中所截取的完全一致。
      

  4.   

    这个Google就有的吧几步操作:
    int code = post.getStatusCode(); // 这个取HTTP状态码。
    if (code == 302) {
        Header header = post.getResponseHeader("location"); // 跳转的目标地址是在 HTTP-HEAD 中的
        String newuri = header.getValue(); // 这就是跳转后的地址,再向这个地址发出新申请,以便得到跳转后的信息是啥。
    }参见:
    http://yefeng.iteye.com/blog/112565
      

  5.   

    对比下,通过浏览器发出的成功的请求包和你通过httpclient发出的导致302的请求包有什么差异呢
      

  6.   


    <script type="text/javascript" language="javascript">
     var br = navigator.userAgent.toLowerCase();
    alert(br);
    </script>看下返回的信息和你的请求头相同不