如何进行Rest API调用以在java中启动可执行文件

时间:2013-09-23 16:13:40

标签: java rest

有人可以提供有关如何使用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>

2 个答案:

答案 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等平台,但是使用此组件是不可避免的。