使用Android上托管的HTTP服务器检索POST数据
问题描述:
我找到了一个how to implement a HTTP server hosted on Android的示例。 它可以正常使用HTTP GET方法。使用Android上托管的HTTP服务器检索POST数据
下面是读取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
,输出为:
请求? = bar from“client_ip”
在这里,我可以很容易地检索GET数据(foo=bar
)。但是,而不是使用HTTP GET方法,我想使用HTTP POST方法...
但我不知道该怎么做。
PS:有关其余代码的更多信息,请参见here。
答
HTTP POST数据存储在消息的HTTP净荷部分。因此,为了检索它们,您需要首先解析有效载荷部分。要做到这一点,最简单的方法是从输入流中读取,直到达到"\r\n\r\n"
。面对这种模式后,其余的被称为有效载荷。所以,你会已经得到两个部分:
之前
"\r\n\r\n"
:这部分是由"\r\n"
分开的HTTP标头。-
"\r\n\r\n"
后:在形式这部分是HTTP POST数据:key1=value1&key2=value2&...
和哪里一个消息的有效载荷部分被存储?在socket.getInputStream()? – Drarig29
@ Drarig29是的,读取所有输入流,并用'“\ r \ n \ r \ n”'分割。 –
“分裂”可能不是正确的用词。您需要从'InputStream'中读取,直到遇到'\ r \ n \ r \ n“结束请求标头。然后你必须解析标题才能知道1)是否发送了一个正文,2)它是如何编码的,3)它是如何终止的。只有这样你才能从'InputStream'中读取正文数据(更多细节请参阅[RFC 2616 section 4.4 Message Length](https://tools.ietf.org/html/rfc2616#section-4.4)),然后解析这个主体基于'Content-Type'请求头('application/x-www-form-urlencoded','multipart/form-data'等)指定的类型。 –