使用 Android 上托管的 HTTP 服务器检索 POST 数据
Retrieve POST data with HTTP server hosted on Android
我找到了 how to implement a HTTP server hosted on Android 的例子。
它适用于 HTTP GET 方法。
这是读取 Socket
的 InputStream
并写入其 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&...
我找到了 how to implement a HTTP server hosted on Android 的例子。 它适用于 HTTP GET 方法。
这是读取 Socket
的 InputStream
并写入其 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&...