GET方式提交的数据超长了,不要用GET方式。换成POST方式提交。
把URL的参数提取出来,不要写到URL里面。

解决方案 »

  1.   

    是不是如楼上说的,长度超限制了。Get方式长度限制为1024个字节。
      

  2.   

    首先谢谢各位的回答,
    另外提一点小小的建议,希望各位在回答之间能稍微花点时间先自己测试一下。
    Get应该是不存在长度的限制的,即使有限制,也不会是1024这么短,而且我的这个字符串长度只有969。
    额外加参数和创建时就传入参数对于java来说效果应该都是一样的,应该只是加入的时间不一样而已。
    另外,经过测试,直接使用socket链接的话,能成功。
    暂时个人猜测是UserAgent导致。
    当然,是否真的是这个方向所导致我并不确定。
      

  3.   

    首先复制你的url访问直接跳转到了:http://m.shgene.net/#WZwenzi
    URL访问输出:200没有LZ说的400跟302
      

  4.   

    我在用android开发时也碰到过相似情况,通过HttpURLConnection获取网页内容时,发出请求一直返回400 。后来查下来是服务端跳转了,设置setInstanceFollowRedirects为false就行。不清楚你是不是类似的原因。
      

  5.   


    public static void main(String[] args) {
    try {
    String s = "http://mobads.baidu.com/ad.html?url=http%3A%2F%2Fm.baidu.com%2Fcpro.php%3Fa0fK000cFDtp14ipxciFcucWgFoHy2H9iL-QuuIcNAkYIMRiaPQiWnmR6W2aNPD15t3bHYIBjLSFbvjfpThNBsKZLbZAU51-HXSkBpuqvKBXOMaqOkbYINsLI1jq.Db_ipx2roRhF596OlZextW6H7sEyFBOg_vTyyxZ-9k1QjPakblN0.IgF_5y9YIZ0lQzqLILT8mh7GuZR8mvqVQsKYUHYs0Zwd5H00IvsqP6KWUMw85yFhrj61myDLgvPsT6KYI1Yz0A7bmvk9TLnqn0KzT1Ys0APYUHdBmy-bIRPdTLw2Tvq80A49IZRqr0KGIA-b5HD10A-Ypy4hUv-b5H00uLKGujYs0ZF-uMKGujYs0APsThqGujY0mMNbuvNYgvN3TA-b5H00my-s5HNGU17hPWPNmvP80ZNGTjd9pAPEPAkRn-Pzu6KWpjY0IA7z5Hc0uZws5HD0TvN_UANzgv-b5Hc0pgPxmgKs5HD0mgKsgv-b5HnznHn1P1mkPWT0mLN1IjdlpZN9UyqB0A4-I7qYXgK-5HD0Uhqs5Hfvnj0s0A7bmhkEmvVxpvN45H00pgPxIv-zuyk-TLnqnfKLmgKxIZ-suHYs0AdEmh-_uNqsUA7YuhqzUHYz0AdETdqvugcqnB31QW00TAsqn0K_XAcqn0KVm1YkuHfYmhn3rfKVIWYk0A4vTjYsQW0snj0snj0s0AT45HD0uh-zTLwxThNMpyq85Hc0TvNWUv4bgLF-uv-EUWY3n1f0TLPs5Hc0TLPsnWYs0ZwYTjY10AwGTLws5H00mycqn0KWThnqnW64PHf0%26__mobads_cookie%3D%26__mobads_sid%3D723ff9d8572510f2&sn=863637021737296&clk=1";
    URL u = new URL(s);
    HttpURLConnection openConnection = (HttpURLConnection) u.openConnection();
    int responseCode = openConnection.getResponseCode();
    InputStream inputStream = openConnection.getInputStream();
    System.out.println(responseCode);
    } catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    测试结果200
      

  6.   


    try {
    String url = "http://mobads.baidu.com/ad.html?url=http%3A%2F%2Fm.baidu.com%2Fcpro.php%3Fa0fK000cFDtp14ipxciFcucWgFoHy2H9iL-QuuIcNAkYIMRiaPQiWnmR6W2aNPD15t3bHYIBjLSFbvjfpThNBsKZLbZAU51-HXSkBpuqvKBXOMaqOkbYINsLI1jq.Db_ipx2roRhF596OlZextW6H7sEyFBOg_vTyyxZ-9k1QjPakblN0.IgF_5y9YIZ0lQzqLILT8mh7GuZR8mvqVQsKYUHYs0Zwd5H00IvsqP6KWUMw85yFhrj61myDLgvPsT6KYI1Yz0A7bmvk9TLnqn0KzT1Ys0APYUHdBmy-bIRPdTLw2Tvq80A49IZRqr0KGIA-b5HD10A-Ypy4hUv-b5H00uLKGujYs0ZF-uMKGujYs0APsThqGujY0mMNbuvNYgvN3TA-b5H00my-s5HNGU17hPWPNmvP80ZNGTjd9pAPEPAkRn-Pzu6KWpjY0IA7z5Hc0uZws5HD0TvN_UANzgv-b5Hc0pgPxmgKs5HD0mgKsgv-b5HnznHn1P1mkPWT0mLN1IjdlpZN9UyqB0A4-I7qYXgK-5HD0Uhqs5Hfvnj0s0A7bmhkEmvVxpvN45H00pgPxIv-zuyk-TLnqnfKLmgKxIZ-suHYs0AdEmh-_uNqsUA7YuhqzUHYz0AdETdqvugcqnB31QW00TAsqn0K_XAcqn0KVm1YkuHfYmhn3rfKVIWYk0A4vTjYsQW0snj0snj0s0AT45HD0uh-zTLwxThNMpyq85Hc0TvNWUv4bgLF-uv-EUWY3n1f0TLPs5Hc0TLPsnWYs0ZwYTjY10AwGTLws5H00mycqn0KWThnqnW64PHf0%26__mobads_cookie%3D%26__mobads_sid%3D723ff9d8572510f2&sn=863637021737296&clk=1";
    HttpClient client=new DefaultHttpClient();
    HttpGet get = new HttpGet(url);
    HttpResponse response = client.execute(get);
    int statusCode = response.getStatusLine().getStatusCode();
    System.out.println(statusCode);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    测试结果,200
      

  7.   

    首先确定这个链接是能最终返回200的,
    使用360浏览器按F12有一个记录功能,查看每一次跳转返回的结果。
    手机浏览器我也试过,可以正常打开,返回没问题,
    android的webView也是能打开的。
    但怪就怪在client请求的时候返回400.
    最后我用socket请求做试验,发现第一跳返回302正常
    第二跳302也正常,
    最后一跳即跳转到http://m.shgene.net/#WZwenzi的时候,出现了400错误。
    最后一跳不是百度的,是广告主服务器的,
    由于400是输入参数异常,所以我猜测应该是我少输入了某些隐形参数。
    比如每一跳是否产生了cookie信息等等?
      

  8.   


    最终直接使用最后的链接测试了一下,确实是最终网站的问题。。
    最终的链接URL:http://m.shgene.net/#WZwenzi
    使用如下的方式访问返回是400.HttpClient client=new DefaultHttpClient();

    HttpGet get=new HttpGet("http://m.shgene.net/#WZwenzi");

    try {
    HttpResponse response = client.execute(get);
    int statusCode = response.getStatusLine().getStatusCode();
    System.out.println(statusCode);
    } catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    但是如果用浏览器打开,返回结果是200.
    现在猜测是不是cookie或者User-Agent的原因。。
    或者是
    URL fragment
    #:WZwenzi
    所导致?
      

  9.   


    经过多次不同的测试,最终查明原因就是
    http://m.shgene.net/#WZwenzi
    中多了#WZwenzi的原因,
    如果去掉#WZwenzi返回200正常。
    对比10楼使用http请求带#WZwenzi返回200的结果,暂时只能猜测我的org.apache.http的那个版本太低或者太高缘故。
    这个包是存在于android中的,想换这个包估计不可能。
    想每次请求的时候使用正则去掉#后面的,但是不确定#后面的是否会带有参数。
    请懂Http请求的帮忙确定一下。
      

  10.   

    #WZwenzi这种格式是重写的,是你访问http://mobads.baidu.com/ad.html?url=http%3A%2F%2Fm.baidu.com%2Fcpro.php%3Fa0fK000cFDtp14ipxciFcucWgFoHy2H9iL-QuuIcNAkYIMRiaPQiWnmR6W2aNPD15t3bHYIBjLSFbvjfpThNBsKZLbZAU51-HXSkBpuqvKBXOMaqOkbYINsLI1jq.Db_ipx2roRhF596OlZextW6H7sEyFBOg_vTyyxZ-9k1QjPakblN0.IgF_5y9YIZ0lQzqLILT8mh7GuZR8mvqVQsKYUHYs0Zwd5H00IvsqP6KWUMw85yFhrj61myDLgvPsT6KYI1Yz0A7bmvk9TLnqn0KzT1Ys0APYUHdBmy-bIRPdTLw2Tvq80A49IZRqr0KGIA-b5HD10A-Ypy4hUv-b5H00uLKGujYs0ZF-uMKGujYs0APsThqGujY0mMNbuvNYgvN3TA-b5H00my-s5HNGU17hPWPNmvP80ZNGTjd9pAPEPAkRn-Pzu6KWpjY0IA7z5Hc0uZws5HD0TvN_UANzgv-b5Hc0pgPxmgKs5HD0mgKsgv-b5HnznHn1P1mkPWT0mLN1IjdlpZN9UyqB0A4-I7qYXgK-5HD0Uhqs5Hfvnj0s0A7bmhkEmvVxpvN45H00pgPxIv-zuyk-TLnqnfKLmgKxIZ-suHYs0AdEmh-_uNqsUA7YuhqzUHYz0AdETdqvugcqnB31QW00TAsqn0K_XAcqn0KVm1YkuHfYmhn3rfKVIWYk0A4vTjYsQW0snj0snj0s0AT45HD0uh-zTLwxThNMpyq85Hc0TvNWUv4bgLF-uv-EUWY3n1f0TLPs5Hc0TLPsnWYs0ZwYTjY10AwGTLws5H00mycqn0KWThnqnW64PHf0%26__mobads_cookie%3D%26__mobads_sid%3D723ff9d8572510f2&sn=863637021737296&clk=1跳转到另外一个地址,它自己定义的,直接访问跳转后的地址,可能没有环境,或者那个参数造成的。302是跳转。
      

  11.   

    #在html中的作用是跳转到执行的位置,一个锚点的作用。
    是可以去掉的,但是考虑到最终的广告商有可能通过JS检测是否具有这个锚点,所以最终采取的措施还是不去除这个锚点标记了。
    #WZwenzi这样增加了这中锚点标记,确实有些httpClien不支持,这个还暂时不知道如何解决,暂时保留。
    此贴就这样了,结贴。