首页 > 解决方案 > 如何将执行的 GROOVY 脚本结果返回到 REST API 响应

问题描述

我正在努力在 Spring Boot 中开发一个 REST API,它将接受请求正文中的任何 groovy 脚本,并将在服务器上执行它并返回执行结果。我试图找出如何获得脚本的执行结果,即使脚本明确没有返回任何值。它就像一个在线 groovy 编译器,您可以在其中发布代码并获取结果

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyShell;
import groovy.lang.Script;

public class GroovyController {
public static void main(String[] args) throws ScriptException {

   System.out.println(runScript());

}


public static String runScript(){
    String script = "class Student {\n" +
            "   private int StudentID;\n" +
            "   private String StudentName;\n" +
            "\t\n" +
            "   void setStudentID(int pID) {\n" +
            "      StudentID = pID;\n" +
            "   }\n" +
            "\t\n" +
            "   void setStudentName(String pName) {\n" +
            "      StudentName = pName;\n" +
            "   }\n" +
            "\t\n" +
            "   int getStudentID() {\n" +
            "      return this.StudentID;\n" +
            "   }\n" +
            "\t\n" +
            "   String getStudentName() {\n" +
            "      return this.StudentName;\n" +
            "   }\n" +
            "\t\n" +
            "   static void main(String[] args) {\n" +
            "      Student st = new Student();\n" +
            "      st.setStudentID(1);\n" +
            "      st.setStudentName(\"Joe\");\n" +
            "\t\t\n" +
            "      println(st.getStudentID());\n" +
            "      println(st.getStudentName());\n" +
            "   } \n" +
            "}";


    GroovyShell shell = new GroovyShell();

    Object result = shell.evaluate(script);
    return result.toString();

}

}

标签: javaspring-bootrestgroovyjava-security

解决方案


我已经弄清楚了如何在安全的沙盒模型中使用 java 运行 groovy 脚本。我使用Groovy Shell类的run方法用 java 运行 groovy 脚本。如果执行的脚本本身返回任何值,例如将返回 4,并且如果脚本没有任何 return 语句并且 shell 的 run 方法将返回 null,则 Run 方法返回结果。return 2 * 4

在 的情况下println("Hello world!!"),它显然不会返回任何内容,但在 API 的请求负载中发送此脚本的客户端会期望打印文本作为响应。要捕获 PrintStream 写入的内容,可以使用绑定将自定义 PrintWriter 绑定到 GroovyShell 中的 out 对象。我编写了一个完整的基于 Spring Boot 的微服务,它公开了一个 REST API 以在安全沙盒模型中的服务器上执行 Groovy 脚本。

完整的微服务代码可以在这里找到脚本执行服务


推荐阅读