2013-01-25 104 views
0

我想用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) 

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

+0

請求方法是隻有一個字GET | POST | HEAD | OPTIONS | PUT | DELETE | TRACE | CONNECT。你的'str'是完整的請求頭,而不是「方法」。 – shuangwhywhy

+0

*「好像我使用的是有效的方法,所以我不知道。」 * - 好像你根本沒看的javadoc。提示,提示 –

回答

3

HTTP請求方法就是一個字: 「GET」, 「POST」,其他行是請求標頭,您可以使用setRequestProperty進行設置。例如:

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

好了,步驟返回並檢查出的文檔爲HttpUrlConnection

HttpUrlConnection是在HTTP之上的抽象。它可以幫助你解決問題,所以你不必手動編寫HTTP字符串,比如你已經完成了。

setRequestMethod需要一個簡單的String,告訴你到底是什麼讓。如果您使用HttpUrlConnection(實際上,GET是默認值,則不需要爲GET設置方法),則不需要手動執行整個HTTP行。

因爲他們是所謂的HttpUrlConnectionsetRequestProperty您可以設置「屬性」。

這就是你會用什麼來設置的標頭,用簡單的鍵值對(和用戶代理是一個頭)。對於參數,因爲你使用的是GET,它們將成爲URL的一部分(查詢字符串)。

如果你想手動發送一個字符串到HTTP服務器,就像你已經構建的那樣(你可能不想,但爲了以防萬一),你只需要用Socket來連接它並且開火(不要使用幫助程序庫,例如HttpUrlConnection)。

+0

那麼我將如何設置useragent以及其他參數? – user1947236

+0

我已經更新了包含對setRequestProperty的引用的答案,您可以將其用於標頭。/ –

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(); 
+0

然後,我會如何設置useragent以及其他參數? – user1947236

+1

'connection.setRequestProperty(「User-Agent」,uAgent);' – rogchap

0

「GET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE」,這些都是有效的參數傳遞波紋管的方法,包括:

void setRequestMethod(String method) 

要設置其他屬性(像,用戶代理你的情況),您可以使用下面的方法類似波紋管:

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

感謝和編碼快樂!