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