2016-08-14 1 views
1

Ich fand ein Beispiel für how to implement a HTTP server hosted on Android. Es funktioniert gut mit HTTP GET-Methode.Abrufen von POST-Daten mit HTTP-Server gehostet auf Android

Hier ist der Code, der die Socket ‚s InputStream und schreibt an seinen OutputStream lautet:

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(); 
     } 
    } 
} 

Zum Beispiel mit der URL <android_device_ip>:<server_port>?foo=bar, der Ausgang ist:

Antrag von/foo? = bar von "client_ip"

Hier kann ich einfach die GET Daten (foo=bar). Aber anstatt HTTP GET-Methode zu verwenden, möchte ich HTTP POST-Methode verwenden ...

Aber ich sehe nicht, wie es geht.

PS: Weitere Informationen zum Rest des Codes finden Sie unter here.

Antwort

2

HTTP-POST-Daten werden im HTTP-Payload-Abschnitt einer Nachricht gespeichert. Um sie abzurufen, müssen Sie zuerst den Payload-Part analysieren. Um dies zu tun, liest man am einfachsten den Eingangsstrom, bis Sie "\r\n\r\n" erreichen. Nach diesem Muster wird der Rest als Payload bezeichnet. Also, haben Sie zwei Teile bekam:

  • Vor "\r\n\r\n": Dieser Teil ist HTTP-Header von "\r\n" getrennt.

  • Nach "\r\n\r\n": Dieser Teil ist HTTP POST-Daten in Form von:

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

und wo wird der Nutzinformations-Abschnitt einer Nachricht gespeichert? In socket.getInputStream()? – Drarig29

+0

@ Drarig29 Ja, lesen Sie alle Eingabe-Stream und teilen Sie es durch '" \ r \ n \ r \ n "'. –

+0

"Split" ist wahrscheinlich nicht das richtige Wort zu verwenden. Sie müssen von 'InputStream' lesen, bis' \ r \ n \ r \ n "' angetroffen wird, um die Request-Header zu beenden. Dann müssen Sie die Header analysieren, um zu wissen, 1) wenn ein Körper gesendet wird, 2) wie es codiert ist und 3) wie es beendet wird. Nur dann können Sie die Körperdaten aus dem 'InputStream' lesen (siehe [RFC 2616 Abschnitt 4.4 Nachrichtenlänge] (https://tools.ietf.org/html/rfc2616#section-4.4) für weitere Details) und dann analysieren der Rumpf basiert auf dem Typ, der durch den Anforderungsheader "Content-Type" angegeben wird ("application/x-www-form-urlencoded", "multipart/form-data" usw.). –