如何在java中调用RESTAPI来启动可执行文件
有人能给出关于如何使用java进行RESTAPI调用以启动可执行文件的建议吗?假设我本地有一个可执行文件,我想对该可执行文件进行RESTAPI调用 带有servlet和jsp的代码片段如何在java中调用RESTAPI来启动可执行文件,java,rest,Java,Rest,有人能给出关于如何使用java进行RESTAPI调用以启动可执行文件的建议吗?假设我本地有一个可执行文件,我想对该可执行文件进行RESTAPI调用 带有servlet和jsp的代码片段 protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException { try{ PrintWriter out = res.getW
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws
IOException {
try{
PrintWriter out = res.getWriter();
String browsefile = req.getParameter("browsefile");
if(browsefile == null || browsefile.equals("")){
out.println("File does not exist");
throw new ServletException("File Name can't be
null or empty");
}
File file = new File("C:/lic/test.li");
// File file = new File("C:/apache-tomcat-
7.0.42/webapps/Lic/test.li");
if(!file.exists()){
out.println("File does not exist");
throw new ServletException("File doesn't exists
on server.");
}
res.setContentType("text/html;charset=UTF-8");
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec
("C:\\tools\\server\\grd.exe" );
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(pr.getInputStream()));
BufferedReader input = new BufferedReader(stdInput);
String serverstarted="";
StringBuffer startOutput = new StringBuffer();
while((serverstarted = input.readLine()) !=
null){
startOutput.append(serverstarted
+ "\n");
}
req.setAttribute("startOutput",
startOutput.toString());
req.getRequestDispatcher
("grdoptions.jsp").forward(req, res);
}catch (Throwable t)
{
t.printStackTrace();
}
finally {
} }
}
JSP:
${requestScope.startOutput}
Web.XML:
开始
com.abc.lic.Start
开始
/开始
您已经将其归档在Java下,因此我将其保存在Java中,并假设您有一些Java web容器或其他可用的容器。您将需要创建一个部署到web容器的包装器组件(Servlet等),以使用RESTful API创建服务
服务的实现将使用Java API通过Runtime.getRuntime().exec()
调用或使用Process/ProcessBuilder类进行系统调用。后者可能是首选。取决于您需要对可执行文件执行什么操作
添加为对您的评论和更新问题的回复:
我认为,你在这方面做得最多(可以说是全部)。简单地说,REST是关于使用标准HTTP方法和谓词提供服务
您可以很容易地争辩说,您拥有的代码已经是RESTful的了。您已经响应包含多部分表单数据的POST请求并运行可执行文件。现在有人在使用浏览器。但另一个客户机上的任何代码都可以按原样发布到您的服务中
添加了更多内容以完成此想法:
另外,关于您的实现还有一件事。您可能希望使POST的URI无参数。也就是说,URI可以是/start/[filename reference]
,而不是/start?browseFile=[filename reference]
。这将是一个有点休息,但并不完全需要开始。在这种情况下,您必须从路径中提取文件名
最后一点注意:如果您也希望保留基于表单的提交,那么将这段代码的“精华”提取到Java类中可能是值得的。有很多方法可以对其进行切片,但是该类可以封装尝试打开文件,并在找到文件后执行EXE。这个类可以从现有的基于表单的JSP和一个新的“REST”JSP调用,该JSP具有稍微不同的URI路径并返回JSON
您拥有所有的部分,只需将它们组装成一个RESTful服务。听起来您对Java应该做什么和REST是什么感到困惑。正如您描述的问题,这将需要在一台计算机上运行两个可执行文件。一个将是一个始终保持活动状态的REST服务器,侦听请求。另一个可能是Java可执行文件,该文件可能会在运行后死亡。REST服务器可以用任何语言编写,我会使用比Java更轻的语言,因为根据它的功能,它的长度不应该超过5行。换句话说,这里没有“RESTAPI”。您可以使用其中一个REST库,用Java编写服务器组件 但这提出了一个问题:为什么有两个过程?听起来,您只是希望Java服务器在请求传入时执行操作。此操作将是可执行文件将运行的任何代码,但它不会运行另一个可执行文件
但听起来你有一个引导问题。某些应用程序必须作为服务器运行,以侦听请求。这个过程是如何开始的?在服务器上的初始化脚本中,由您手动使用Heroku或AWS等平台,但无法避免使用此组件。您的意思是公开RESTful服务的应用程序在调用您的服务时应该执行外部应用程序?@Luiggi Mendoza:是的,这正是我需要的Thomas:感谢您的回复。目前,我正在使用servlet和jsp来完成这项工作。ie在网页中,我必须浏览一个文件,当选择该文件时,我单击“提交”按钮,启动.exe文件,并在网页上显示启动.exe文件的详细信息,依此类推。现在我被要求对此进行RESTAPI调用。我是webservices新手,所以不知道如何进行RESTAPI调用。我用从网页启动.exe文件的代码片段编辑了上面的问题。好的,我的意见是你完成了,基本上:-)。或者你需要为这个问题添加更多的上下文。我的问题是如何使用REST api执行上述操作,或者如何对上述操作进行REST api调用。现在我想我根本没有回答你的实际问题。你的问题真的是:“如何以编程方式发布到HTML表单?”:哎呀,这是我的错。我没有注意到你在上面编辑的答案。你确实回答了我的问题。非常感谢你的回答。所以,如果我想测试它,我需要为它创建一个客户端。
<form action="start" METHOD="GET" enctype="multipart/form-data">
<input type="file" name="browsefile" />
<input type="submit" name="start"
value="StartServer" />
</form>
<div id="result">
<pre>
${requestScope.startOutput}
</pre>
</div>
<servlet>
<servlet-name>Start</servlet-name>
<servlet-class>com.abc.lic.Start</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Start</servlet-name>
<url-pattern>/start</url-pattern>
</servlet-mapping>