【问题标题】:Get POST Data from HttpExchange从 HttpExchange 获取 POST 数据
【发布时间】:2017-05-06 15:35:52
【问题描述】:

这似乎是一个常见的用例,应该有一个简单的解决方案,但我所看到的到处都是极其臃肿的例子。

假设我有一个看起来像这样的表单:

<form action="http://localhost/endpoint" method="POST" enctype="multipart/form-data">
    <input type="text" name="value" />
    <input type="submit" value="Submit"/>
</form>

我提交它并在服务器上想要获取输入值:

在服务器上,我设置了一个带有单个端点的 HttpServer,在这种情况下,它只是将正文数据直接发送回来:

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.*;
import java.net.InetSocketAddress;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        try {
            HttpServer server = HttpServer.create(new InetSocketAddress(80), 10);
            server.setExecutor(null);
            server.createContext(
                    "/endpoint",
                    (HttpExchange httpExchange) -> {

                            InputStream input = httpExchange.getRequestBody();
                            StringBuilder stringBuilder = new StringBuilder();

                            new BufferedReader(new InputStreamReader(input))
                                .lines()
                                .forEach( (String s) -> stringBuilder.append(s + "\n") );

                            httpExchange.sendResponseHeaders(200, stringBuilder.length());

                            OutputStream output = httpExchange.getResponseBody();
                            output.write(stringBuilder.toString().getBytes());

                            httpExchange.close();
                    }
            );

            server.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

现在,如果使用输入 "hi" 提交表单,则返回

------WebKitFormBoundaryVs2BrJjCaLCWNF9o
Content-Disposition: form-data; name="value"

hi
------WebKitFormBoundaryVs2BrJjCaLCWNF9o--

这告诉我应该有一种方法来获取字符串值,但我能看到的唯一方法是手动解析它。

(另外,我试图弄脏一点,只使用 JDK 附带的库来实现这个服务器。我在工作中使用了 Apache 服务器很多,但这不是我想要的尝试在这里做。)

【问题讨论】:

  • 嗯,这就是所有这些 JDK 和 Java EE 之外的库都存在的原因之一:让这变得更简单。你故意选择了困难的方式,弄脏你的手,所以它比简单的方式更难,你必须弄脏你的手。不过,如果您不选择让表单使用 multipart/form-data,那会容易得多。
  • 我在使用 URL 编码时遇到了同样的问题。还是要解析出信息。
  • 当然可以,但是解析应该更容易。
  • 是的,你是对的。我会这样做的。
  • 在这种情况下,您找到处理文件的好方法了吗?如果仅存在文本数据,我可以解析,但如果存在文件则无法解析。

标签: java http httpserver http-post-vars


【解决方案1】:
public Server() throws IOException {
    HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
    server.createContext("/", new HttpHandler() {
        @Override
        public void handle(HttpExchange t) throws IOException {
            StringBuilder sb = new StringBuilder();
            InputStream ios = t.getRequestBody();
            int i;
            while ((i = ios.read()) != -1) {
                sb.append((char) i);
            }
            System.out.println("hm: " + sb.toString());

            String response = " <html>\n"
                    + "<body>\n"
                    + "\n"
                    + "<form action=\"http://localhost:8000\" method=\"post\">\n"
                    + "input: <input type=\"text\" name=\"input\"><br>\n"
                    + "input2: <input type=\"text\" name=\"input2\"><br>\n"
                    + "<input type=\"submit\">\n"
                    + "</form>\n"
                    + "\n"
                    + "</body>\n"
                    + "</html> ";
            t.sendResponseHeaders(200, response.length());
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();

        }
    });
    server.setExecutor(null);
    server.start();
}

不确定你是想要这个还是什么,但这会返回所有帖子页面的字符串,其中包含名称和值

这样

input=value&input2=value2&......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2014-05-13
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多