Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java检索POST数据_Java_Http Post - Fatal编程技术网

使用Java检索POST数据

使用Java检索POST数据,java,http-post,Java,Http Post,我正在尝试制作一个Java服务器,它可以使用POST接收和返回数据。到目前为止,我一直在尝试使用nameValuePairs(尽管可以使用另一种方法),让服务器接受连接并接受HTTP头,但从这里我无法理解如何获取任何附加数据。下面的代码打印出报头,并在客户机需要时发送100响应——但是如何从消息中获取数据呢 while(true){ inputLine = clientInput.readLine(); System.out.println("cl

我正在尝试制作一个Java服务器,它可以使用POST接收和返回数据。到目前为止,我一直在尝试使用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);
ArrayList postParams=new ArrayList();
添加(新的BasicNameValuePair(“字段”,“此处的数据”);
UrlEncodedFormEntity uefe=新的UrlEncodedFormEntity(
后参数);
请求设置实体(uefe);
HttpResponse response=client.execute(请求);

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

如果您确实需要手动完成此操作,您应该阅读,因为它可能比您现在尝试的操作更复杂。如果您真正想要的是一种将小型Java web服务器嵌入到某个东西中的方法,请查看。它真的很容易进入其他应用程序

它应该简单到:

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
    }
}

从上下文来看,您似乎应该研究如何使用servlet,并在Jetty这样的轻量级servlet平台上运行它


必须重写Servlet类上的doPost方法。在对象上,使用getParameterNames()获取所有上传的参数名称,使用getParameter()获取它们的值。

根据您的代码,我的理解是您的方法是打开服务器套接字并逐行读取。
您应该在这里查找标题“内容长度”。
此标题显示POST请求中包含的正文的大小。
从你的问题来看,我认为你收到了一个类似于以下内容的POST请求:

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

name1=value1&name2=value2
请注意HTTP头和实际数据之间的额外新行(即
'\n'
)。
您应该使用内容长度和您已经知道HTTP请求中与HTTP头相关的数据的位置这一事实来解析它并提取感兴趣的值。
因此,您最终将获得
name1=value1&name2=value2

如果你只是想把它作为一种锻炼,那就去做吧。
它比您想象的要复杂,您必须稍微看看RFC。
例如,我不记得它实际上是
'\n'
'\r\n'
或类似的东西。
此外,我不记得内容长度是否始终存在(例如,在响应中,内容长度可能会丢失,http服务器可能会以编码块的形式发送响应)。
如果您确实需要这样做,那么您应该使用http服务器实现。
已经有一个用java提供的http服务器实现,或者您可以使用apache的实现。

不要试图重新发明轮子,除非你是为了教育或娱乐。

谢谢你的回答,我应该解释一下,虽然它是一个普通的Java服务器,但我正在使用BufferedReader(代码中的clientInput)读取客户端响应,但这很可能是错误的方法。谢谢carson,我更喜欢自己做(它不需要多功能,也不需要做任何事情,只需要接收数据并发送其他信息)。据我所知,在我发送100-continue之后,客户机将发送该对,尽管BufferedReader、clientInput此时将返回null,如果我调用readLine()之前不知道如何使用servlet,我会试一试,然后带着结果回来。最大的问题是如果你让它工作起来,如果你不能控制客户,它可能会再次崩溃。如果你控制了客户端,你可能不应该使用HTTP,而是应该使用直接套接字,如果你想手工完成的话。是的,这就是我试图做的,我提取了内容长度,但不确定如何/或用它解析什么。上一条消息之间有一条换行符是正确的,但在此之后,套接字显示为关闭!?客户端消息:内容长度:17客户端消息:内容类型:应用程序/x-www-form-urlencoded客户端消息:主机:192.168.1.144:5000客户端消息:连接:保持活动客户端消息:用户代理:Apache HttpClient/不可用(java 1.4)客户端消息:Expect:100 Continue 100响应已发送客户端消息:java.net.SocketException:socketclosed@Smoo:一旦找到
Expect
,您将中断while循环(根据OP中的代码)。那么你停止阅读。那么你是如何得到异常的呢?你应该做的是i)得到内容长度标题ii)找到新行字符。然后开始内容正文。继续从流中读取内容长度指示的内容。解析内容以获取名称值pairsI应该提到我更改了代码,这样它就不会在expect时停止,但换行后它会抛出异常,即套接字关闭。我现在只在插座上使用了直的物体though@Smoo:很难从您的帖子中看出为什么会出现异常。您是否正在关闭客户端的输出流?如果关闭,则链接到流的底层套接字也将关闭。因为Java 6 Java附带了HTTP服务器(即:无需嵌入Jetty)。如果你想要一个真正轻量级的HTTP服务器,你可能想在谷歌上搜索NanoHTTPD。