Javascript 如何从web服务中调用web服务

Javascript 如何从web服务中调用web服务,javascript,java,Javascript,Java,我对REST世界,或者事实上是java的WebApp方面都是新手,所以请不要介意这是一个愚蠢的问题。 我有一个网页,按下按钮将调用以下JS函数: function testFunction(){ $(document).ready(function() { $.ajax({ url: "http://localhost:8080/test/webapi/myresource", type: '

我对REST世界,或者事实上是java的WebApp方面都是新手,所以请不要介意这是一个愚蠢的问题。 我有一个网页,按下按钮将调用以下JS函数:

function testFunction(){
        $(document).ready(function() {
            $.ajax({
                url: "http://localhost:8080/test/webapi/myresource",
                type: 'get',
                success: function (data) {
                    console.log(data)
                }
                });
        });
    }
上面的url由我自己的web服务(java)处理,即上面的GET将调用以下web服务:

@Path("myresource")
public class MyResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
    return "Got it!";
}}
这里我只想调用另一个javascript函数(专用于处理服务器类请求)而不是返回“Got It”,该函数涉及外部rest调用,例如:

        function externalResource() {
        $(document).ready(function() {
            $.ajax({
                url: "any_external_rest_call",
                type: 'get',
                dataType: 'json',
                success: function (data) {
                    document.getElementById('demo').innerHTML = "Perfect"
                }
                });
        });
    }
我想将数据从externalResource函数返回到getIt()并最终返回testFunction(),我知道这是可能的,但在网上找不到很多细节。如果有人能把这件事告诉我,那将非常有帮助。

看看他的:。然而,这是春天。鉴于您正在使用JAX-RS,请看以下内容:

您描述的流程是不可能的,但是,在使用来自上一个响应的响应的数据时,可以链接多个请求:

$(document).ready(function() {
    $.ajax({
        url: "http://localhost:8080/test/webapi/myresource1",
        type: 'get',
        success: function (data) {
            $.ajax({
                url: "http://localhost:8080/test/webapi/myresource2?id="+data.id,
                type: 'get',
                success: function (data) {
                    console.log(data)
                }
            });
        }
    });
});

在Java中,不能从REST方法调用JavaScript代码。但是,您可以使用
javax.ws.rs.client
包的
ClientBuilder

您的方法可以如下所示:

@Path("myresource")
public class MyResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {

        client = ClientBuilder.newClient();
        target = client.target("http://api.anotherRestService.com/details/")

        return target.request(MediaType.APPLICATION_JSON)
            .get();
    }
}

这只是一个例子,我没有在真实的环境中尝试,但这就是如何做到的。现在,您可以使用JS方法
testFunction
调用Java后端的REST方法。在REST方法
getIt
中,使用创建的客户端调用另一个REST服务。第二个rest调用的结果将返回给JS方法
testFunction

如果您希望从服务器调用另一个URL,这是一个重定向调用。下面是一个使用Spring框架的服务器端代码示例

@RequestMapping("/to-be-redirected")
public RedirectView localRedirect() {
    RedirectView redirectView = new RedirectView();
    redirectView.setUrl("http://www.google.com");
    return redirectView;
}

正如其他人所提到的,您也可以使用Spring RestTemplate来实现这一点。

我不明白,您想从Java函数调用内部调用“另一个javascipt函数”?为什么不在Java函数
getIt()
中创建一个webclient,并使用
的完整URL“任何外部\u rest\u调用”
要调用外部Web服务并将结果作为
getIt()
方法的结果返回,听起来您希望您的API从另一个API获取数据,然后对其进行处理并将其转发给客户端。这意味着您所需要的只是从Java发出一个API调用(通过客户端进行调用是毫无意义的)。这意味着您需要这样做:您可以使用嵌套获取,代码比ajax调用更易于阅读:并且允许您逐个嵌套许多查询非常感谢,但是当我返回它时,testFunction中的回调成功函数没有得到执行,它在控制台中说“net::ERR_complete_CHUNKED_ENCODING”,我甚至试着用MediaType.APPLICATION_JSON更改products参数,但仍然没有LuckId您是否也在原始请求(ajax)中定义了APPLICATION/JSON?也可能存在不匹配。Ajax有两个字段
contentType
datatype
,这两个字段也应该定义。什么contentType提供了第二个rest调用?您为第二次服务请求哪些数据?大量数据可能会导致超时问题。实际上,我将最终返回更改为字符串的实体并返回了它,然后它就工作了。。谢谢你,伙计