加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Play Framework 2 – 调用Web服务并返回一个对象

发布时间:2020-12-14 19:35:08 所属栏目:Java 来源:网络整理
导读:我有一个模型,我想填充Web服务的详细信息.我想异步这样做,以免阻塞服务器线程.我们假装它是一个登录服务. 现在我想要做的是向远程服务器发出请求并最终返回User模型对象.所以方法签名看起来像这样: public static User loginUser(String username,String pa
我有一个模型,我想填充Web服务的详细信息.我想异步这样做,以免阻塞服务器线程.我们假装它是一个登录服务.

现在我想要做的是向远程服务器发出请求并最终返回User模型对象.所以方法签名看起来像这样:

public static User loginUser(String username,String password) {

我理解为了对Web服务进行异步调用,我应该使用Promise:

Promise<WS.Response> wsPromise = WS.url("http://myserver.com/login")
            .setContentType("application/json; charset=utf-8")
            .post("... the username and password ...");

哪个还没有启动请求.我可以在这个对象上调用get()来对服务进行阻塞调用.这有效.

为了异步执行此操作,我认为我需要映射它并以某种方式执行它.

Promise<User> resultPromise = wsPromise.map(new F.Function<WS.Response,User>() {
    @Override
    public User apply(WS.Response response) throws Throwable {
        System.out.println(response.getBody());
        return new User(... based on something extracted from the returned JSON ...);
    }
});

现在我该如何触发此操作?如果我在resultPromise上调用get(),它会调用但最终会触发Timeout Exception.我不能使用async(…)方法,因为它只返回一个Result.

看看其他例子(https://github.com/jroper/play-promise-presentation/blob/master/src/main/java/controllers/Application.java),这似乎是模式.即我们总是希望返回一个Result对象.但是,我无法查询Result对象,我也没有计划将该特定对象发送给用户.

实际上,这些示例似乎调用Web服务,将JSON结果映射到对象,然后立即将它们映射回相同的JSON.当我想将User(在我的情况下)传递回调用函数时,没什么用处.

说实话,我对这种异步性质有点困惑(你可能已经猜到了).特别是,这实际上是一个阻止操作,因为我们必须等待Web服务返回响应.文档似乎表明使用Promise / Future模式将避免这种阻塞.

底线是:如何在不阻止Play Framework服务器中的线程的情况下将Web服务调用的结果映射回模型对象?

随意滥用我对Play Framework缺乏经验…

解决方法

这个答案可能来得太晚了,但是会发布它以防万一其他人现在仍然想知道同样的问题,并想要回答这个问题.

有两种方法可以实现这一点,即使两者都使用相同的JsonNode类:

>第一个是你所期待的:“新用户(..something …)”

在这种情况下,您可以使用JsonNode的“get”方法来获取创建User对象所需的特定数据(我的示例中的用户名和电子邮件,因为您没有指定必填字段).

Promise<User> resultPromise = wsPromise.map(new F.Function<WS.Response,User>() {
    @Override
    public User apply(WS.Response response) throws Throwable {
        System.out.println(response.getBody());
        JsonNode json = response.asJson();
        return new User(json.get("username"),json.get("email"));
    }
});

>另一个选项是,如果您知道Web Service确实返回User对象的有效Json表示.

就个人而言,我认为这个选项更容易,并依赖于fromJson’s method from Json类.

Promise<User> resultPromise = wsPromise.map(new F.Function<WS.Response,User>() {
    @Override
    public User apply(WS.Response response) throws Throwable {
        System.out.println(response.getBody());
        return Json.fromJson(response.asJson(),User.class);
    }
});

我希望这个答案可以帮助人们想知道如何以一种简单的方式做到这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读