2012-10-04 63 views
1

代碼爲什麼我無法從java中的POST請求中讀取正文?

public HttpRequest(BufferedReader from) { 
String firstLine = ""; 

try { 
    firstLine = from.readLine(); 
} catch (IOException e) { 
    System.out.println("Error reading request line: " + e); 
} 

String[] tmp = firstLine.split(" "); 
method = tmp[0]; 
URI = tmp[1]; 
version = tmp[2]; 
System.out.println("URI is: " + URI); 

if(method.equals("POST")){ 
    try { 
     String line = from.readLine(); 
     while (line.length() != 0) { 
      headers += line + CRLF; 
      if (line.startsWith("Host:")) { 
       tmp = line.split(" "); 
       if (tmp[1].indexOf(':') > 0) { 
        String[] tmp2 = tmp[1].split(":"); 
        host = tmp2[0]; 
        port = Integer.parseInt(tmp2[1]); 
       } else { 
        host = tmp[1]; 
        port = HTTP_PORT; 
       } 
      } 
      line = from.readLine(); 
     } 
     headers += "Connection: close" + CRLF; 
     headers += CRLF; 
    } 
    catch (IOException e) { 
     System.out.println("Error reading from socket: " + e); 
     return; 
    }  
} 
else { 
    System.out.println("Error: Method not supported"); 
    return; 
} 

System.out.println("Host to contact is: " + host + " at port " + port); 
    } 

問題

我正在使用Java代理服務器。

上面的代碼處理HTTP POST請求。它成功讀取POST標題並將其打印在命令提示符中,但正文缺失。

你能看看我的代碼,看看問題嗎?謝謝。

(注:我排除的GET部分,因爲有與無的問題。)

結果

Result

Result

+0

您能編輯上面的內容來顯示您收到的輸出 – calderonmluis

+0

完成。請檢查結果部分。 –

+1

將line.length()!= 0改爲(line = from.readLine())!= null) 使用line.length()!= 0可能會導致問題,如果由於某種原因存在在POST之前的空白行正文。 – calderonmluis

回答

2

問題是你仍然有東西要讀取InputStream。這就是爲什麼當你關閉瀏覽器時,沒有其他東西可以讀取,所以打印出來。你必須精確地讀出了在「內容長度」

嘗試這樣宣佈的字節數:

int cL = Integer.valueOf(contentLength); 
byte[] buffer  = new byte[cL]; 
String postData = ""; 

System.out.println("Reading "+ cL + "bytes"); 
in.read(buffer, 0, cL); 
postData = new String(buffer, 0, buffer.length); 
System.out.println(postData); 

主體請求將在POSTDATA字符串。

0

這不是如何寫一個代理服務器。代理服務器只需執行以下操作:

  1. 接受傳入連接。對於每個連接:
  2. 讀取HTTP CONNECT請求。
  3. 連接到CONNECT請求中指定的目標主機,並向客戶端發送適當的響應。
  4. 如果連接成功,則在上游服務器和下游客戶端之間同時在兩個方向上覆制字節
  5. 當您在一個方向上讀取EOS時,請關閉對面的輸出插座。
  6. 當你在兩個方向關機時,關閉兩個插座。

就是這樣。沒有解析POST請求或其他需要的東西。甚至不是讀者。

+0

我會注意到這一點。但是在我的問題的背景下,你能否說我在將請求主體作爲字符串獲取方面做了什麼錯?謝謝。 –

+0

@jrmeasures我的答案隱含了答案。你做錯了什麼是編寫大量不必要的代碼來做不必要的事情,比如將POST請求體作爲一個String,當你應該做的只是複製字節,甚至不關心它是GET,PUT,POST, HEAD,DELETE,...或者頭部和身體都在哪裏。不需要任何人調試你應該扔掉的代碼。 – EJP

相關問題