0

我正在尝试使用 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

4 回答 4

3

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

con.setRequestProperty("User-Agent", uAgent);
于 2013-01-25T03:57:06.327 回答
2

好的,退后一步,查看以下文档HttpUrlConnection

HttpUrlConnection是对 HTTP 的 TOP 的抽象。它可以帮助您,因此您不必像您所做的那样手动编写 HTTP 字符串。

setRequestMethod需要一个简单的String,并确切地告诉你它允许什么。如果使用,则不需要手动执行整个 HTTP 行HttpUrlConnection(实际上,GET 是默认设置,只是不要为 GET 设置方法)。

您可以根据需要设置“属性”,HttpUrlConnection使用setRequestProperty.

这就是您用来设置标题的方法,带有简单的键值对(并且用户代理是一个标题)。对于参数,由于您使用的是 GET,它们将成为 URL(查询字符串)的一部分。

如果您想手动将字符串发送到 HTTP 服务器,就像您构建的那样(您可能不想这样做,但以防万一),您只需要使用 a 连接到它Socket并开火(不要使用一个辅助库,例如HttpUrlConnection)。

于 2013-01-25T03:55:00.320 回答
0

根据文档(http://docs.oracle.com/javase/1.5.0/docs/api/java/net/HttpURLConnection.html#setRequestMethod(java.lang.String)),setRequestMethod唯一需要的方法是“GET "、"POST"、"PUT" 等。

你想要这样的东西:

URL serverAddress = new URL("http://localhost");
//set up out communications stuff
HttpURLConnection connection = null;

//Set up the initial connection
connection = (HttpURLConnection)serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setReadTimeout(10000);

connection.connect();
于 2013-01-25T03:56:57.073 回答
0

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

void setRequestMethod(String method)

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

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

感谢和快乐的编码!

于 2013-01-25T04:05:25.223 回答