Статьи

Работа с REST-приложением с помощью конечной точки с возможностью создания сценариев

Мне нравится тот факт, что JDK поставляется с ScriptEngine. Это настолько гибко, когда вы хотите оценить и устранить неполадки в приложении, которое уже развернуто в серверной среде. Добавьте эту конечную точку REST в приложение Java EE, и она предоставит вам мгновенный доступ к внутренним состояниям приложения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package myrestapp;
 
import java.io.StringReader;
import java.util.logging.Logger;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
 
/**
 * Give instant access to your internal application with dynamic scripting.
 *
 * <p>Example script:
 * <pre>
 * "sc" + servletContext + ", req=" + request;
 * </pre>
 *
 * <p>Example2
 * <pre>
 * names = servletContext.getAttributeNames();
 * while(names.hasMoreElements()) {
 *   name = names.nextElement();
 *   println(name);
 * }
 * </pre>
 */
@Path("script")
public class ScriptResource {
    private static final Logger logger = Logger.getLogger(ScriptResource.class.getName());
     
    @Context
    private ServletContext servletContext;
         
    @POST
    public String script(@Context HttpServletRequest request, String scriptText) throws Exception {
        String engineName = "JavaScript";
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName(engineName);
        logger.info("Running script text length=" + scriptText.length() + ", engine=" + engine);
        Object result = null;
        try (StringReader reader = new StringReader(scriptText)) {
            Bindings bindings = engine.createBindings();
            bindings.put("servletContext", servletContext);
            bindings.put("request", request);
            result = engine.eval(reader, bindings);
        }
        logger.info("Result " + result);
        return "" + result;
    }
}

Обратите внимание, что я уже дал несколько примеров JavaScript в области комментариев. У вас будет доступ к двум связующим переменным, которые должны предоставить вам полный доступ ко многим внутренним компонентам вашего приложения.

Нужен пользовательский интерфейс для проверки этой конечной точки? Как насчет попробовать расширение Chrome «Advance Rest Client»? (Спасибо моему коллеге Крису Гриффину за советы по этому классному расширению. Это действительно удобный инструмент!).