【问题标题】:Calling multiple web services调用多个 Web 服务
【发布时间】:2016-10-14 05:38:43
【问题描述】:

我正在使用带有 Scala 的 Play 2.5,我创建了一个将多次调用外部 Web 服务的类。

在某些条件下调用外部 Web 服务并获得 ok 或 nok 的简单响应。如果没问题,那么我应该更新内部对象状态,如果没有,我现在什么都不做。

这是我的类,它接受一个字符串列表作为参数,并返回一个在控制器中处理的未来对象列表。

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 是 list of list 类型,但我希望它只是一个简单的响应列表。
1)如何简化和更正我的代码以获得响应列表,以便以后检查是否正常?

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

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    看起来你希望这个块返回一个List[Future[Json]],然后你可以使用"List[Future] to Future[List] disregarding failed futures"或类似的。

    为此,您应该使用 map 和 flatMap(而不是 isDefined/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]
                    }
                }
            }
        }
    }
    

    if 块分配给 AnyVal 而不是特定类型(这会导致您出现问题):

    scala> if (true) 23
    23: AnyVal
    
    scala> if (false) 23
    (): AnyVal
    

    使用 map 让你保持在 Option monad:

    scala> (None: Option[Int]).map(_ * 2)
    None: Option[Int]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多