1

任何人都可以就如何进行 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>
4

2 回答 2

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 服务。

于 2013-09-23T16:30:48.600 回答
1

听起来您对 Java 应该做什么以及 REST 是什么感到困惑。正如您描述的问题,这将需要在一台机器上运行两个可执行文件。一个是 REST 服务器,它始终保持活动状态,监听请求。另一个可能是 Java 可执行文件,它可能会运行然后死掉。您可以用任何语言编写的 REST 服务器,我会使用比 Java 更轻量级的语言,因为根据它的功能,它的长度实际上不应该超过 5 行。换句话说,这里没有“REST API”。您可以使用 Java 中的一个 REST 库来编写服务器组件。

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

但听起来你有一个引导问题。一些应用程序必须作为服务器运行,监听请求。这个过程是如何开始的?在服务器上的初始化脚本中,由您手动利用 Heroku 或 AWS 等平台,但拥有此组件是不可避免的。

于 2013-09-23T16:48:58.197 回答