簡體   English   中英

如何進行Rest API調用以在Java中啟動可執行文件

[英]How to make a Rest API call to start an executable file in java

誰能提供有關如何進行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>

您已將此文件保存在Java下,因此我將其保留在Java中,並假定您有一些Java Web容器或其他可用的Web容器。 您將需要創建一個包裝器組件(Servlet等),並部署到Web容器中,以使用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和新的“ REST” JSP中調用該類,該新的“ REST” JSP的URI路徑略有不同,並且返回JSON。

您擁有所有部分,只需要將它們組裝成RESTful服務即可。

聽起來您對Java應該做什么以及REST是什么感到困惑。 如您所描述的,這將需要在一台計算機上運行兩個可執行文件。 一個將是始終保持活動狀態,監聽請求的REST服務器。 另一個可能是Java可執行文件,該文件可能運行然后死亡。 您可以用任何語言編寫的REST服務器,我將使用比Java輕量級的語言,因為基於它的作用,它實際上不應超過5行。 換句話說,這里沒有“ REST API”。 可以使用其REST庫之一用Java編寫服務器組件。

但這提出了一個問題:為什么要有兩個過程? 聽起來您只希望運行一個Java服務器,當請求進入時,該Java服務器將執行一個操作 。此操作將是可執行文件將運行的任何代碼,但不會運行另一個可執行文件。

但這聽起來像是您遇到了引導問題。 某些應用程序必須作為服務器運行,以偵聽請求。 過程如何開始? 在服務器上的初始化腳本中,您可以手動使用諸如Heroku或AWS的平台,但是不可避免地要擁有此組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM