1

我是 Play 框架的新手,并尝试使用 JavaWS 调用 RESTful API。我一直在为此苦苦挣扎。这是我到目前为止所拥有的:

此代码基于 JavaWS 文档(我发现它很混乱),旨在发出请求。我认为它的工作原理是恢复“ok”结果的完成阶段,其中包含一个字符串,该字符串是将响应转换为文本的结果。

import javax.inject.Inject;

import com.fasterxml.jackson.databind.JsonNode;
import play.mvc.*;
import play.libs.ws.*;
import java.util.concurrent.*;

import static play.mvc.Results.ok;

public class MyClient implements WSBodyReadables, WSBodyWritables {
    private final WSClient ws;

    @Inject
    public MyClient() {
        this.ws = ws;
    }

    public CompletionStage<Result> index() {
        return ws.url("http://example.com").get().thenApply(response ->
                ok(response.asText())
        );
    }

}

然后从控制器调用此代码:

public Result call(){
    MyClient client = new MyClient();

    try {
        return client.index()
                .toCompletableFuture()
                .get();
    } catch(Exception e){
        Logger.error("ah fuck");
    }
    return internalServerError();
}

我目前收到一条错误消息,上面写着“变量 ws 可能尚未初始化”,这是有道理的,因为我没有初始化 ws。我无法弄清楚如何正确初始化 WSClient 实例,也无法真正理解之后会发生什么。任何帮助将不胜感激。

谢谢。

4

2 回答 2

0

或者,您可以使用 Netflix 的 Feign 库来创建 Rest 客户端。

于 2018-07-15T05:41:45.097 回答
0

@rkj 说得对:

注入@Inject WSClient ws; 在您的控制器中,然后将 ws 实例传递给 >MyClient 类并从那里访问它。MyClient 客户端 = new MyClient(this.ws);

加上一些小错误,它起作用了。谢谢!

于 2018-07-15T14:57:19.880 回答