使用Java检索POST数据

时间:2011-01-23 13:51:51

标签: java http-post

我正在尝试创建一个可以使用POST接受和返回数据的Java服务器。到目前为止,我一直在尝试使用nameValuePairs(虽然另一种方法很好)并让服务器接受连接,并接受HTTP标头,但从这里我无法理解如何获取任何附加数据。以下代码打印出标题并在客户端期望时发送100响应 - 但如何从消息中获取数据?

        while(true){
        inputLine = clientInput.readLine();
        System.out.println("client-msg: " + inputLine);
        if("Expect:".equals(inputLine.split(" ")[0])){
            sendResponse(100, "Continue");
            break;
        }

这是(android java)客户端发送的内容,我希望在服务器端获取名称对

            ArrayList<NameValuePair> postParams = new ArrayList<NameValuePair>();
        postParams.add(new BasicNameValuePair("field", "data here"));
        UrlEncodedFormEntity uefe = new UrlEncodedFormEntity(
                postParams);
        request.setEntity(uefe);
        HttpResponse response = client.execute(request);

这可能相当简单,但我似乎找不到任何非PHP的PHP教程。

3 个答案:

答案 0 :(得分:2)

如果您确实需要手动执行此操作,则应阅读HTTP RFC,因为它可能比您现在尝试的更复杂。如果您真正想要的是一种将小型Java Web服务器嵌入到某些内容中的方法,请查看Jettyembed Jetty很容易进入其他应用。

它应该像以下一样简单:

public class SimpleServletContext
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);

        context.addServlet(new ServletHolder(new PostServlet()),"/*");

        server.start();
        server.join();
    }
}

public class PostServlet extends HttpServlet
{
    public PostServlet()
    { 
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // do something with the posted data
    }
}

答案 1 :(得分:1)

从您的代码中我的理解是您的方法是逐行打开服务器套接字和读入 你应该在这里做的是找到标题“Content-length” 此标题显示POST请求中携带的正文大小 从您的问题来看,我认为您收到的POST请求类似于以下内容:

POST /path HTTP/1.1
From: myUser
User-Agent: java
Content-Length: 32

name1=value1&name2=value2

请注意HTTP标头与实际数据之间的额外新行(即'\n') 您应该使用内容长度以及您已经知道HTTP标头中与HTTP标头相关的数据的位置,在HTTP请求中解析它并提取感兴趣的值。
这样你最终得到了name1=value1&name2=value2 如果您只想将其作为练习,请继续 它比你想象的要复杂得多,你必须先看一下RFC 例如,我不记得它实际上是'\n''\r\n'或类似的东西 此外,我不记得内容长度是否始终存在(例如,在响应中它可能会丢失,http服务器可能会以编码块的形式发送响应)。
如果您需要认真对待,那么您应该使用http服务器实现 已经有一个在java中提供的http服务器实现,或者你可以使用apache 不要试图重新发明轮子,除非你是为了教育或娱乐。

答案 2 :(得分:0)

从上下文来看,看起来你应该考虑使用Servlet,并在像Jetty这样的轻量级servlet平台上运行它。

您必须覆盖Servlet类上的doPost方法。在HttpServletResponse对象上,使用getParameterNames()获取所有上传的参数名称,使用getParameter()获取其值。