为什么HttpClient请求返回400,URL请求返回302正常? GET方式提交的数据超长了,不要用GET方式。换成POST方式提交。把URL的参数提取出来,不要写到URL里面。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是如楼上说的,长度超限制了。Get方式长度限制为1024个字节。 首先谢谢各位的回答,另外提一点小小的建议,希望各位在回答之间能稍微花点时间先自己测试一下。Get应该是不存在长度的限制的,即使有限制,也不会是1024这么短,而且我的这个字符串长度只有969。额外加参数和创建时就传入参数对于java来说效果应该都是一样的,应该只是加入的时间不一样而已。另外,经过测试,直接使用socket链接的话,能成功。暂时个人猜测是UserAgent导致。当然,是否真的是这个方向所导致我并不确定。 首先复制你的url访问直接跳转到了:http://m.shgene.net/#WZwenziURL访问输出:200没有LZ说的400跟302 我在用android开发时也碰到过相似情况,通过HttpURLConnection获取网页内容时,发出请求一直返回400 。后来查下来是服务端跳转了,设置setInstanceFollowRedirects为false就行。不清楚你是不是类似的原因。 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 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 首先确定这个链接是能最终返回200的,使用360浏览器按F12有一个记录功能,查看每一次跳转返回的结果。手机浏览器我也试过,可以正常打开,返回没问题,android的webView也是能打开的。但怪就怪在client请求的时候返回400.最后我用socket请求做试验,发现第一跳返回302正常第二跳302也正常,最后一跳即跳转到http://m.shgene.net/#WZwenzi的时候,出现了400错误。最后一跳不是百度的,是广告主服务器的,由于400是输入参数异常,所以我猜测应该是我少输入了某些隐形参数。比如每一跳是否产生了cookie信息等等? 最终直接使用最后的链接测试了一下,确实是最终网站的问题。。最终的链接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所导致? 经过多次不同的测试,最终查明原因就是http://m.shgene.net/#WZwenzi中多了#WZwenzi的原因,如果去掉#WZwenzi返回200正常。对比10楼使用http请求带#WZwenzi返回200的结果,暂时只能猜测我的org.apache.http的那个版本太低或者太高缘故。这个包是存在于android中的,想换这个包估计不可能。想每次请求的时候使用正则去掉#后面的,但是不确定#后面的是否会带有参数。请懂Http请求的帮忙确定一下。 #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是跳转。 #在html中的作用是跳转到执行的位置,一个锚点的作用。是可以去掉的,但是考虑到最终的广告商有可能通过JS检测是否具有这个锚点,所以最终采取的措施还是不去除这个锚点标记了。#WZwenzi这样增加了这中锚点标记,确实有些httpClien不支持,这个还暂时不知道如何解决,暂时保留。此贴就这样了,结贴。 JAVA Socket 文件下载文件夹无法递归 如何使用java的url字段 java 基础问题 java类加载后调用其方法出错? 接口调用问题——请教 请教捕捉键盘事件问题。。。 请问Java怎么编写代码访问一个网址然后在搜索栏自动的输入信息搜索啊 我是一个刚开始学习java的人 请教一个java编译环境的问题?万分感谢!!! Thinking in java第一版里的好多程序不能运行,为什么??(初学者疑惑) jdk1.3 standard 与 jdk1.2 enterprise有何区别? 多线程中出现的一个的奇怪现象 关于String类型转化为char[]类型数组的地址问题
另外提一点小小的建议,希望各位在回答之间能稍微花点时间先自己测试一下。
Get应该是不存在长度的限制的,即使有限制,也不会是1024这么短,而且我的这个字符串长度只有969。
额外加参数和创建时就传入参数对于java来说效果应该都是一样的,应该只是加入的时间不一样而已。
另外,经过测试,直接使用socket链接的话,能成功。
暂时个人猜测是UserAgent导致。
当然,是否真的是这个方向所导致我并不确定。
URL访问输出:200没有LZ说的400跟302
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
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
使用360浏览器按F12有一个记录功能,查看每一次跳转返回的结果。
手机浏览器我也试过,可以正常打开,返回没问题,
android的webView也是能打开的。
但怪就怪在client请求的时候返回400.
最后我用socket请求做试验,发现第一跳返回302正常
第二跳302也正常,
最后一跳即跳转到http://m.shgene.net/#WZwenzi的时候,出现了400错误。
最后一跳不是百度的,是广告主服务器的,
由于400是输入参数异常,所以我猜测应该是我少输入了某些隐形参数。
比如每一跳是否产生了cookie信息等等?
最终直接使用最后的链接测试了一下,确实是最终网站的问题。。
最终的链接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
所导致?
经过多次不同的测试,最终查明原因就是
http://m.shgene.net/#WZwenzi
中多了#WZwenzi的原因,
如果去掉#WZwenzi返回200正常。
对比10楼使用http请求带#WZwenzi返回200的结果,暂时只能猜测我的org.apache.http的那个版本太低或者太高缘故。
这个包是存在于android中的,想换这个包估计不可能。
想每次请求的时候使用正则去掉#后面的,但是不确定#后面的是否会带有参数。
请懂Http请求的帮忙确定一下。
是可以去掉的,但是考虑到最终的广告商有可能通过JS检测是否具有这个锚点,所以最终采取的措施还是不去除这个锚点标记了。
#WZwenzi这样增加了这中锚点标记,确实有些httpClien不支持,这个还暂时不知道如何解决,暂时保留。
此贴就这样了,结贴。