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

问题描述 投票:4回答:3

我想要做的是,在执行以下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();
    } 
}

如何让浏览器执行警报功能?我们可以通过在Server Side REST API中做一些技巧来实现这一目标吗?

java rest jersey-2.0
3个回答
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>";
    }

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>";
}

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
}
© www.soinside.com 2019 - 2024. All rights reserved.