java - 如何将执行的 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();
}
}
解决方案
我已经弄清楚了如何在安全的沙盒模型中使用 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 脚本。
完整的微服务代码可以在这里找到脚本执行服务
推荐阅读
- visual-studio-code - VSCode Junit输出不显示
- vb.net - VB.Net GZip 压缩产生太多数据,无法解码
- python - 使用 HyperlinkedModelSerializer 我们可以制作一些没有 url 的字段(ForeignKey 字段),只有 id(如果没有详细视图)
- javascript - kendo ui grid - 如何在保持编辑对话框打开的同时取消更改
- python - 将字符串列表转换为熊猫中的行
- javascript - 笔记本电脑到手机(Twilio 可编程视频)显示黑屏
- julia - 在 Julia 中调用“MKL pardiso”的问题
- mongodb - 客户端 JavaScript 中 mongo shell 中的 NumberInt() 等价物是什么?
- python - 是否可以像这样抓取 javascript 图表?
- java - 来自 cassandra 检查的时间戳空值在 java 中失败