使用 Android 上托管的 HTTP 服务器检索 POST 数据

Retrieve POST data with HTTP server hosted on Android

我找到了 how to implement a HTTP server hosted on Android 的例子。 它适用于 HTTP GET 方法。

这是读取 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,输出为:

Request of /?foo=bar from "client_ip"

在这里我可以很容易地检索到GET数据(foo=bar)。但是我不想使用 HTTP GET 方法,而是使用 HTTP POST 方法...

但我不知道该怎么做。

PS :有关其余代码的更多信息,请参阅 here

HTTP POST 数据存储在消息的 HTTP 负载部分。因此,为了检索它们,您需要首先解析有效负载部分。要做到这一点,最简单的方法是从输入流中读取直到到达 "\r\n\r\n"。面对这个模式之后,剩下的就是payload。所以,你将有两个部分:

  • "\r\n\r\n"之前:这部分是由"\r\n"分隔的HTTP头。

  • "\r\n\r\n"之后:这部分是HTTPPOST数据,格式为:

    key1=value1&key2=value2&...