如何使一个REST API调用来启动Java中的可执行文件(How to make a Rest A

2019-10-18 15:53发布

任何人都可以就如何使一个REST API调用使用Java来启动一个可执行文件的建议? 假设我在本地的可执行文件,我想打一个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>

Answer 1:

你的Java提交下这一点,所以我会保持它的Java,并假定你有一些Java Web容器或其他可用。 您需要创建一个包装组件(Servlet的,等等),部署到Web容器中,用一个RESTful API创建服务。

服务的实施将使用Java API通过使系统调用Runtime.getRuntime().exec()调用,或使用Process /的ProcessBuilder类。 后者可能是优选的。 取决于你需要与你的可执行文件做什么。

添加到您的评论和更新的问题的回答:

你那里的方式最多(可以说是全部),我想。 过于简单化,REST是关于使用标准的HTTP方法和动词使可用的服务。

你可以很容易地认为,你的代码已经是RESTful的。 你已经回应了包括多形式的数据并运行可执行文件POST请求。 现在,这是一个人在使用浏览器。 但是坐在另一个客户端上的任何一段代码可以张贴到你的服务,因为它旁边。

更增添了几分完成了思想:

此外,关于您的实现一两件事。 你可能会喜欢做的URI POST参数的。 也就是说,你可以有URI中/start/[filename reference] ,而不是/start?browseFile=[filename reference] 。 这将是更多的REST-Y,但并不完全需要得到持续。 你不得不从路径提取您的文件名,在这种情况下。

最后要注意的:如果你想保持你的基于表单的提交以及,它可能是值得的提取该代码“肉”到一个Java类。 有很多的方式来切它,但这个类可以封装试图打开该文件,一旦找到该文件执行你的EXE。 这个类可以从现有的基于表单的JSP被调用,一个新的“休息” JSP有一个稍微不同的URI路径和返回JSON。

你把所有的部件,您只需将它们组装成一个RESTful服务。



Answer 2:

这听起来像你感到困惑的Java应该做什么,什么是REST。 当你描述你的问题,这将需要一台机器上运行两个可执行文件。 一会始终保持活着,监听请求一个REST服务器。 另一个将是大概运行然后死一个Java可执行文件。 其余的服务器,你可以用任何语言写的,我会用一个重量更轻的语言比Java,因为它真的不应该长于长的基础上他们做的5行。 换句话说,没有“REST API”在这里。 你可以用Java编写的服务器组件,使用其REST的图书馆之一。

但是,这提出了一个问题:为什么有两个进程? 这听起来像你只是想在收到请求时,此操作将是任何代码可执行文件将运行一个执行操作的Java服务器运行,但它不会运行另一个可执行文件。

但它听起来像是你有一个引导的问题。 有些应用程序都运行作为服务器,侦听请求。 请问怎么处理开始? 在服务器上的init脚本,通过手动,利用像Heroku的或AWS的平台,但它不可避免有此组件。



文章来源: How to make a Rest API call to start an executable file in java
标签: java rest