2016-08-14 86 views
1

我找到了一個how to implement a HTTP server hosted on Android的示例。 它可以正常使用HTTP GET方法。使用Android上託管的HTTP服務器檢索POST數據

下面是讀取SocketInputStream並寫入其OutputStream代碼:

private class HttpResponseThread extends Thread { 

    Socket socket; 
    String h1; 

    HttpResponseThread(Socket socket, String msg) { 
     this.socket = socket; 
     h1 = msg; 
    } 

    @Override 
    public void run() { 
     BufferedReader br; 
     PrintWriter pw; 
     String request; 

     try { 
      br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      request = br.readLine(); 

      pw = new PrintWriter(socket.getOutputStream(), true); 

      String response = 
        "<html><head></head>" + 
          "<body>" + 
          "<h1>" + h1 + "</h1>" + 
          "</body></html>"; 

      pw.print("HTTP/1.0 200" + "\r\n"); 
      pw.print("Content type: text/html" + "\r\n"); 
      pw.print("Content length: " + response.length() + "\r\n"); 
      pw.print("\r\n"); 
      pw.print(response + "\r\n"); 
      pw.flush(); 

      msgLog += String.format("Request of %s from %s\n", request, socket.getInetAddress().toString()); 

      socket.close(); 

      MainActivity.this.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        infoMsg.setText(msgLog); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

例如,與URL <android_device_ip>:<server_port>?foo=bar,輸出爲:

/富的

請求? = bar from「client_ip」

在這裏,我可以很容易地檢索GET數據(foo=bar)。但是,而不是使用HTTP GET方法,我想使用HTTP POST方法...

但我不知道該怎麼做。

PS:有關其餘代碼的更多信息,請參見here

回答

2

HTTP POST數據存儲在消息的HTTP淨荷部分。因此,爲了檢索它們,您需要首先解析有效載荷部分。要做到這一點,最簡單的方法是從輸入流中讀取,直到達到"\r\n\r\n"。面對這種模式後,其餘的被稱爲有效載荷。所以,你會已經得到兩個部分:

  • 之前"\r\n\r\n":這部分是由"\r\n"分開的HTTP標頭。

  • "\r\n\r\n"後:在形式這部分是HTTP POST數據:

    key1=value1&key2=value2&... 
    
+0

和哪裏一個消息的有效載荷部分被存儲?在socket.getInputStream()? – Drarig29

+0

@ Drarig29是的,讀取所有輸入流,並用'「\ r \ n \ r \ n」'分割。 –

+0

「分裂」可能不是正確的用詞。您需要從'InputStream'中讀取,直到遇到'\ r \ n \ r \ n「結束請求標頭。然後你必須解析標題才能知道1)是否發送了一個正文,2)它是如何編碼的,3)它是如何終止的。只有這樣你才能從'InputStream'中讀取正文數據(更多細節請參閱[RFC 2616 section 4.4 Message Length](https://tools.ietf.org/html/rfc2616#section-4.4)),然後解析這個主體基於'Content-Type'請求頭('application/x-www-form-urlencoded','multipart/form-data'等)指定的類型。 –