2011-06-14 103 views
3

我正在尝试使用HttpURLConnection在Java中使用一些参数执行GET请求。但是,每次我这样做,每次都会收到400:错误的请求。 我需要改变以使其工作?HttpURLConnection GET请求获取400错误请求

String url = "http://www.awebsite.com/apath?p1=v1&p2=v2&p3=v3"; 
HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection(); 
conn.setDoInput(true); 
conn.setDoOutput(false); 
conn.setUseCaches(false); 
conn.setRequestMethod("GET"); 
conn.setRequestProperty("Host", "www.awebsite.com"); 
conn.setRequestProperty("User-Agent", "Mozilla/4.0"); 
conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
conn.setRequestProperty("Accept-Language", "en-us,en;q=0.5"); 
conn.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
conn.setRequestProperty("Keep-Alive", "115"); 
conn.setRequestProperty("Connection", "keep-alive"); 
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
StringBuilder data = new StringBuilder(); 
String s = ""; 
while((s = br.readLine()) != null) 
    data.append(s); 
String pageData = data.toString(); 

我曾尝试:

  • 对整个查询中使用的URLEncoder(后?),只是在数值。
  • 设置内容长度标题。
  • 将连接设置为使用输出并将查询作为输出。
+0

你正在编写自己的机器人吗?你为什么克隆Mozilla? – 2011-06-14 09:34:03

+0

我将网址切换到http://google.com,它对我来说工作得很好。 – hoipolloi 2011-06-14 09:34:41

+0

@精英绅士我在用户代理中使用了Mozilla/4.0,正如我在cURL文档中所读到的那样,它是某些CGI所需要的。 @hoipolloi奇怪,我使用它的上下文有一个相当长的查询,这是行不通的。 – DanielGibbs 2011-06-14 09:44:51

回答

2

该代码尝试打开连接到www.awebsite.com,但它也发送非法/无效值的主机字段:www.google.com。这是HTTP规范绝对不允许的。

您必须更正此问题,以确保www.awebsite.com的服务器接收到正确的标头集,以便它可以处理您的请求。

强制性链路How to use java.net.URLConnection to fire and handle HTTP requests?

+1

糟糕,我的网址最初是一个非常长的谷歌作为主机,我简化了它的例子。 – DanielGibbs 2011-06-14 09:41:49

+0

@DanieL,即使那样我也不认为HTTP请求会很好地形成。我怀疑在请求中会有两个“主机”标头。我想你应该删除涉及'Host'头的行。 – 2011-06-14 09:43:08

+0

我曾尝试删除'主机'标题,但没有改变。我也在你发布的链接中使用了代码,但是我得到了同样的错误。 – DanielGibbs 2011-06-14 09:52:17