我正在尝试使用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)
好像我正在使用有效的方法,所以我不知道。
答案 0 :(得分:3)
HTTP请求方法只有一个词:“GET”,“POST”等。其他行是您可以使用setRequestProperty
设置的请求标头。例如:
con.setRequestProperty("User-Agent", uAgent);
答案 1 :(得分:2)
好的,退一步查看HttpUrlConnection
的文档:
HttpUrlConnection
是HTTP的TOP的抽象。它可以帮助您,因此您不必手动编写HTTP字符串,例如您已经完成的操作。
setRequestMethod
需要一个简单的String
,并且完全告诉您它允许的内容。如果使用HttpUrlConnection
,则无需手动执行整个HTTP行(事实上,GET是默认值,只是不要为GET设置方法)。
您可以使用setRequestProperty
为HttpUrlConnection
调用“属性”。
这就是你用来设置标题的方法,使用简单的键值对(而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>)
谢谢你,编码愉快!