播放框架REST API调用

时间:2018-07-15 03:27:21

标签: java api http playframework java-ws

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

此代码基于JavaWS文档(我发现这很令人困惑),并且用于发出请求。我认为它可以通过恢复“确定”结果的完成阶段来工作,该结果包含一个字符串,该字符串是将响应转换为文本的结果。

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实例,也无法真正理解之后的情况。任何帮助将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

@rkj说对了:

  

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

那加上一些小错误,它奏效了。谢谢!