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

时间:2016-08-14 16:07:30

标签: android http post serversocket

我找到了value 1.5 is obsolete and will be removed in a future release的示例。 它适用于HTTP GET方法。

以下是读取Socket的{​​{1}}并写入其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(); } } } ,输出为:

  

来自“client_ip”的/?foo = bar的请求

在这里,我可以轻松检索GET数据(<android_device_ip>:<server_port>?foo=bar)。但是我不想使用HTTP GET方法,而是想使用HTTP POST方法...

但我不知道该怎么做。

PS:有关其余代码的详细信息,请参阅how to implement a HTTP server hosted on Android

1 个答案:

答案 0 :(得分:2)

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

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

  • "\r\n\r\n"之后:此部分是以下形式的HTTP POST数据:

    key1=value1&key2=value2&...