我想要做的是,在执行以下REST API之后,浏览器应该提醒" Hello World !!"浏览器中的字符串。
我认为使用@Produces(" text / javascript")注释该函数将会处理它。但是当我在下面的网址点击资源时
http://localhost:8080/JAXRS-HelloWorld/rest/script/helloWorld
JAXRS-HelloWorld是App的名称,我已将url指定为/ rest *
我得到的所有东西都是String。不是可执行的Javascript代码。
package com.bablo.rest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
@Path("script")
public class JavaScriptTesting {
@GET
@Produces("text/javascript")
@Path("/helloWorld")
public Response helloWorld(){
String responseParam = "alert(Hello World!!)";
return Response.ok(responseParam).build();
}
}
如何让浏览器执行警报功能?我们可以通过在服务器端REST API中做一些技巧来实现这一目标吗?
答案 0 :(得分:3)
您希望服务器执行客户端javascript。这不会起作用。
您需要更新REST客户端,以便评估服务器返回的javascript代码:
var response = callRestApi();
eval(response);
或者您可以返回嵌入脚本的HTML代码,以便浏览器对其进行评估:
@GET
@Path("/test")
@Produces(value = MediaType.TEXT_HTML)
public String test() {
return "<script>alert('test');</script>";
}
答案 1 :(得分:0)
@GET
@Path("/admission")
@Produces(value = MediaType.TEXT_HTML)
public String admission(@QueryParam("id") String id){
System.out.println("PARAMETRO RECIBIDO : "+id);
return "<script>alert('Notificacion exitosa');</script>";
}
答案 2 :(得分:0)
我们使用Command模式和window.call()函数来执行命令。
命令需要匹配要执行的JavaScript方法(这就是toString()被覆盖的原因)
public enum Commands {
LOAD_BLOCK,
@Override
public String toString() {
String[] parts = name().split("_");
StringBuilder sb = new StringBuilder();
// loop through all parts of the name
for (int i = 0; i < parts.length; i++) {
String word = parts[i];
// use a lowercase letter for the first word
if (i == 0) {
sb.append(word.toLowerCase());
// follow camel case pattern (first letter capital)
} else {
sb.append(String.valueOf(word.charAt(0)));
sb.append(word.substring(1, word.length()).toLowerCase());
}
}
return sb.toString();
}
}
从Rest资源构建并将命令发送到客户端
Command load = new Command(Commands.LOAD_BLOCK.toString(), new String[]{"b1"})
return Response.status(200).entity(load).build();
在JavaScript文件中,准备一个方法,该方法调用此Rest资源,并运行如下所示的方法,该方法将命令列表作为输入并以提供的参数执行。
function triggerEvents(commands){
for (var index = 0; index < commands.length; index++){
var command = commands[index];
console.debug("executing " + command.function);
await window[command.function].call(null, command.arguments);
}
}
它将查找匹配的函数,并在找到给定参数的情况下执行
async function loadBlock(blockId) {
// do some work
}