我正在尝试创建一个可以使用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教程。
答案 0 :(得分:2)
如果您确实需要手动执行此操作,则应阅读HTTP RFC,因为它可能比您现在尝试的更复杂。如果您真正想要的是一种将小型Java Web服务器嵌入到某些内容中的方法,请查看Jetty。 embed 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()获取其值。