2011-01-23 66 views
1

我試圖製作一個可以接受並使用POST返回數據的Java服務器。到目前爲止,我一直試圖使用nameValuePairs(儘管另一種方法是好的),並讓服務器接受連接,並接受HTTP頭,但從這裏我無法理解如何獲得任何附加數據。以下代碼輸出標題並在客戶端期望它時發送100響應 - 但是如何從消息中獲取數據?使用Java檢索POST數據

 while(true){ 
     inputLine = clientInput.readLine(); 
     System.out.println("client-msg: " + inputLine); 
     if("Expect:".equals(inputLine.split(" ")[0])){ 
      sendResponse(100, "Continue"); 
      break; 
     } 

這裏是什麼(機器人JAVA)客戶端發送的,我希望得到的名稱對出在服務器端

  ArrayList<NameValuePair> postParams = new ArrayList<NameValuePair>(); 
     postParams.add(new BasicNameValuePair("field", "data here")); 
     UrlEncodedFormEntity uefe = new UrlEncodedFormEntity(
       postParams); 
     request.setEntity(uefe); 
     HttpResponse response = client.execute(request); 

這可能是相當簡單的,但我做不到似乎找到任何非PHP的POST教程。

+0

自從Java 6 Java帶有一個HTTP服務器(即:不需要嵌入Jetty)。如果你是在一個非常輕量級的HTTP服務器之後,你可能想要Google for NanoHTTPD。 – SyntaxT3rr0r 2011-01-23 15:48:25

回答

2

如果您確實需要手工操作,您應該閱讀HTTP RFC,因爲它可能比您現在要做的更復雜。如果你真正想要的是一種嵌入小型Java Web服務器的方式,請查看Jettyembed Jetty很容易進入其他應用程序。

它應該是一樣簡單:

public class SimpleServletContext 
{ 
    public static void main(String[] args) throws Exception 
    { 
     Server server = new Server(8080); 

     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     context.setContextPath("/"); 
     server.setHandler(context); 

     context.addServlet(new ServletHolder(new PostServlet()),"/*"); 

     server.start(); 
     server.join(); 
    } 
} 

public class PostServlet extends HttpServlet 
{ 
    public PostServlet() 
    { 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
     // do something with the posted data 
    } 
} 
+0

感謝carson,我寧願自己做這件事(它不需要是多功能的,或者除了接收數據和發回別的東西外,不需要做其他事情)。據我知道,我發送100-繼續後,客戶端發送該對,雖然BufferedReader,clientInput將返回null在這一點上,如果我打電話readLine() – Aidan 2011-01-23 14:28:53

+0

以前不知道有關使用此servlet,我會給你一個機會,並回來的結果。 – Aidan 2011-01-23 14:31:52

+0

最大的問題是,如果你得到它的工作,它可能會再次打破,如果你沒有客戶端的控制。如果你控制了客戶端,你可能不應該使用HTTP,而是使用直接套接字,如果你想手動完成。 – carson 2011-01-23 14:39:55

0

根據上下文,它看起來好像你應該考慮使用Servlet和一個輕量級的servlet平臺就像碼頭運行它。

您必須重寫Servlet類上的doPost方法。在HttpServletResponse對象上,使用getParameterNames()獲取所有上傳的參數名稱,並使用getParameter()獲取它們的值。

1

從你的代碼我的理解是你的方法是打開一個服務器套接字並逐行讀入。
你應該在這裏做的是找到頭「內容長度」。
此標題顯示POST請求中攜帶的正文的大小。
從你的問題,我認爲你是收到POST請求類似於以下:

POST /path HTTP/1.1 
From: myUser 
User-Agent: java 
Content-Length: 32 

name1=value1&name2=value2 

注意的HTTP標頭和實際數據之間的額外的新行(即'\n')。
您應該使用內容長度以及您已經知道與HTTP頭相關的數據在哪裏,然後在HTTP請求中解析它並提取感興趣的值。
這樣你最終得到了name1=value1&name2=value2
如果您只是想將其作爲練習,請繼續。
它比你想象的要複雜得多,你得看看RFC。
例如,我不記得它實際上是一個'\n''\r\n'或類似的東西。
此外,我不記得內容長度是否會一直存在(例如,在響應中它可能會丟失,並且http服務器可能會以編碼的塊形式發送響應)。
如果您需要認真對待,那麼您應該使用http服務器實現。
在java中已經有一個http服務器實現,或者你可以使用apache的。
不要試圖重新發明輪子,除非你是爲了教育或樂趣而做。