如何返回由Jersey Rest中的客户端执行的javascript代码?

时间:2014-08-06 11:41:05

标签: java rest jersey-2.0

我想要做的是,在执行以下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中做一些技巧来实现这一目标吗?

3 个答案:

答案 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
}