Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中调用RESTAPI来启动可执行文件_Java_Rest - Fatal编程技术网

如何在java中调用RESTAPI来启动可执行文件

如何在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

有人能给出关于如何使用java进行RESTAPI调用以启动可执行文件的建议吗?假设我本地有一个可执行文件,我想对该可执行文件进行RESTAPI调用

带有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:


${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>