Java HTTP请求无效的方法?

时间:2013-01-25 03:48:32

标签: java http

我正在尝试使用java来创建HTTP请求,但我得到的方法无效,我不知道为什么。这是我的代码:

String str = "GET / HTTP/1.1\r\nHost: " + this.url + "\r\n";
int i=r.nextInt(agents.length);
String uAgent = agents[i]; //agents is an array of user agents.
  str = str + "User-Agent: "+uAgent+"\r\n";
  str = str + "Content-Length: " + (int)(Math.random() * 1000.0D) + "\r\n"; //random content length for now
  str = str + "X-a: " + (int)(Math.random() * 1000.0D) + "\r\n"; //random

 HttpURLConnection con = (HttpURLConnection) new URL(this.url).openConnection();
 con.setRequestMethod(str);
 con.setConnectTimeout(5000); //set timeout to 5 seconds
 con.connect();
 System.out.print(".");

我得到的错误是:

java.net.ProtocolException: Invalid HTTP method: GET / HTTP/1.1
Host: http://example.com/
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)
Content-Length: 434
X-a: 660   
    at java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:339)
    at jbot.HTTP.run(HTTP.java:88)

好像我正在使用有效的方法,所以我不知道。

4 个答案:

答案 0 :(得分:3)

HTTP请求方法只有一个词:“GET”,“POST”等。其他行是您可以使用setRequestProperty设置的请求标头。例如:

con.setRequestProperty("User-Agent", uAgent);

答案 1 :(得分:2)

好的,退一步查看HttpUrlConnection的文档:

HttpUrlConnection是HTTP的TOP的抽象。它可以帮助您,因此您不必手动编写HTTP字符串,例如您已经完成的操作。

setRequestMethod需要一个简单的String,并且完全告诉您它允许的内容。如果使用HttpUrlConnection,则无需手动执行整个HTTP行(事实上,GET是默认值,只是不要为GET设置方法)。

您可以使用setRequestPropertyHttpUrlConnection调用“属性”。

这就是你用来设置标题的方法,使用简单的键值对(而user-agent是标题)。对于params,因为你正在使用GET,它们将成为URL(查询字符串)的一部分。

如果你想手动将字符串发送到HTTP服务器,就像你构建的那样(你可能不想,但为了以防万一),你只需要用Socket来连接它。并且消防(不要使用诸如HttpUrlConnection之类的帮助库)。

答案 2 :(得分:0)

根据文档(http://docs.oracle.com/javase/1.5.0/docs/api/java/net/HttpURLConnection.html#setRequestMethod(java.lang.String)) {{1}只需要方法即“GET”,“POST”,“PUT”等。

你想要这样的东西:

setRequestMethod

答案 3 :(得分:0)

“GET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE”,这些是传递方法的有效参数:

void setRequestMethod(String method)

要设置其他属性(例如,在您的情况下为User-Agent),您可以使用以下方法,如下所示:

con.setRequestProperty("<Property-name>", <property-value>)

谢谢你,编码愉快!