当前位置: 首页 > 知识库问答 >
问题:

调用多个web服务

司空炯
2023-03-14

我在Scala上使用Play 2.5,我创建了一个类,可以多次调用外部web服务。

外部Web服务在某些条件下被调用并得到ok或nok的简单响应。如果可以,那么我应该更新内部对象状态,如果可以,我现在什么也不做。

这是我的类,它将String的列表作为参数,并返回要在控制器中处理的对象的Future列表。

def callWSAndGetResponse(listOfList: List[List[String]]): Future[List[MyObject]] = {

    val res = listOfList map { listOfIds =>
        listOfIds map { id =>
            val foundObj = allMyObject.find(obj => obj.id == id)
            if(foundObj.isDefined) {
                foundObj.get.urls map { url =>
                    val futureReponse: Future[WSResponse] = ws.url(url).get()

                    futureResponse map { response =>
                        (response.json \ "response").as[String]
                    }
                }
            }
        }

    }

    // if responses are ok create a list of MyObject to return for example.


}

val res是列表类型的列表,但我希望它只是一个简单的响应列表。
1)如何简化和纠正我的代码以获得响应列表,以便以后检查是否确定?

2)如何检查响应是否正常或失败?

共有1个答案

须原
2023-03-14

看起来您希望这个块返回一个< code>List[Future[Json]],然后您可以使用“List[Future]to Future[List]ignoring failed futures”或类似的语句。

要做到这一点,您应该使用map和faceMap(而不是isDeated/get):

val res = listOfList map {
    _.map { id =>
        allMyObject
            .find(obj => obj.id == id)
            .map {
                _.flatMap {url =>
                    val futureReponse: Future[WSResponse] = ws.url(url).get()
                    futureResponse map { response =>
                        (response.json \ "response").as[String]
                }
            }
        }
    }
}

如果块分配给AnyVal而不是特定类型(这将导致您在此处出现问题):

scala> if (true) 23
23: AnyVal

scala> if (false) 23
(): AnyVal

使用地图让你在选项单声道:

scala> (None: Option[Int]).map(_ * 2)
None: Option[Int]
 类似资料:
  • 我有一个Java的Play 2.1控制器,需要调用一个外部的webservice来获取一些数据。然后有了这个数据结果,我必须用n次调用调用另一个web服务,对应于第一个web service调用的n个结果。 对于性能问题,我想使用 promise 在单独的线程中进行 n 次调用。 所以我会有一个这样的循环: 如何使用异步API同步n个promise,然后在一个响应(所有结果的列表)中减少结果,然后

  • 问题内容: 我用来调用Firebase请求函数,并在请求完成后得到通知,以便能够处理结果。在这种情况下,我只是打印了一条语句。 这段代码工作正常。 问题 在于,在运行时,数据将被添加到Firebase数据库中。这就是为什么我必须使用而不是。 这意味着在运行时会有一个观察者,并且如果数据已添加到数据库中,则将再次调用其中的块。 一旦发生这种情况,该应用就会崩溃,因为没有调用。只要我说对了。 如果将其

  • 我正在使用Camel,并使用CXF从WSDL生成代码。我生成了一个客户端存根,实现如下所示: 如您所见,端口接受两个参数并返回响应,我想将其委托回我的骆驼路由。在 Camel 中实现这一点的最佳方法是什么?我已经定义了我的 CXF Enpoint,我只是在努力解决其中的 DSL 路由部分。我应该添加像此链接中那样的处理器吗?Apache Camel和Web服务 谢谢

  • 我想从作为web服务使用的cfc中调用cfc。web服务只是向调用者返回一个状态通知,但是我需要启动另一个cfc来启动一些进程,打开一个ftp获取一个文件并将其下载到我们的服务器。目前我得到了这个错误。操作GetFile原因550无法打开文件。详细错误:550无法打开文件。.消息FTP GetFile操作过程中出现错误。打开文件。. 当我从一个url直接调用流程cfc或从另一个页面调用时,它工作正

  • 我正在努力增加我在Android上的代码覆盖率。但我找不到测试这个演示者的正确方法。onSelectContact会进行一个服务调用,随后my ServiceFactory.GetContactService会进行另一个调用。我怎么能嘲笑这些电话呢?

  • 问题内容: 在我的Web服务器应用程序中,我有一个方法,该方法可以修改xml文档并看起来类似于: 使用的zip归档文件包含需要修改的xml文件和其他一些文件。如何区分使用的xml文件和方法内部的归档以及应该使用哪种方法参数来表示此使用的资源? 问题答案: 一种解决方案是只读取。您可以将包裹在中。有了,您可以得到with ,然后可以得到与文件名。然后只要检查名称即可。 不过,您需要消耗。这是一个简单