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.
und wo wird der Nutzinformations-Abschnitt einer Nachricht gespeichert? In socket.getInputStream()? – Drarig29
@ Drarig29 Ja, lesen Sie alle Eingabe-Stream und teilen Sie es durch '" \ r \ n \ r \ n "'. –
"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.). –