2016-08-14 5 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と、出力は次のとおりです。?/ fooというの

リクエスト= 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ヘッダであるので、次の2つの部分を持っているでしょう。 "\r\n\r\n"

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

とメッセージのペイロード部分が格納されない:この部分はの形でHTTP POSTデータでありますかsocket.getInputStream()で? – Drarig29

+0

@ Drarig29はい、すべての入力ストリームを読んで、それを '" \ r \ n \ r \ n "'で分割します。 –

+0

"split"はおそらく正しい単語ではありません。リクエストヘッダーを終了するには '\ r \ n \ r \ n" 'が見つかるまで' InputStream'から読み込む必要があります。次に、ヘッダーを解析して、1)本文が送信されている場合、2)エンコードされている場合、3)終了している場合を認識する必要があります。それでは、あなたは 'InputStream'から本文データを読むことができます(詳細については、[RFC 2616セクション4.4メッセージ長](https://tools.ietf.org/html/rfc2616#section-4.4)を参照してください) 'Content-Type'リクエストヘッダ(' application/x-www-form-urlencoded'、 'multipart/form-data'など)で指定された型に基づいています。 –

関連する問題