有人可以提供有关如何使用Java启动Rest API调用来启动可执行文件的建议吗?假设我在本地有一个可执行文件,我想对该可执行文件进行REST api调用。
带有servlet和jsp的代码片段
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:
<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>
WEB.XML:
<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>
答案 0 :(得分:2)
你已经在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]
。这将是一个更多的REST-y,但并不是完全需要开始。在这种情况下,您必须从路径中提取文件名。
最后一点:如果你想保留基于表单的提交,那么将这段代码的“肉”提取到Java类中可能是值得的。有很多方法可以对它进行切片,但是该类可以封装尝试打开文件,并在找到文件后执行EXE。可以从现有的基于表单的JSP调用此类,以及具有稍微不同的URI路径并返回JSON的新“REST”JSP。
您拥有所有部件,只需将它们组装成RESTful服务。
答案 1 :(得分:1)
听起来你对Java应该做什么以及REST是什么感到困惑。在您描述问题时,这将需要在一台计算机上运行两个可执行文件。一个是REST服务器,它始终保持活跃状态,监听请求。另一个是Java可执行文件,可能会运行然后死掉。你可以用任何语言编写的REST服务器,我会使用比Java更轻量级的语言,因为根据它的作用,它实际上不应该长于5行。换句话说,这里没有“REST API”。您可以使用其中一个REST库在Java中编写服务器组件。
但这提出了一个问题:为什么有两个过程?听起来你只想要一个运行的Java服务器在请求进入时执行操作。这个操作将是可执行文件运行的任何代码,但它不会运行另一个可执行文件。
但听起来你有一个引导问题。某些应用程序必须作为服务器运行,并侦听请求。 进程如何启动?在服务器上的init脚本中,您可以手动利用Heroku或AWS等平台,但是使用此组件是不可避免的。