2016-06-13 3 views
1

Play 2.5를 스칼라와 함께 사용하고 있는데, 여러 번 외부 웹 서비스를 호출 할 클래스를 만들었습니다.여러 웹 서비스 호출하기

외부 웹 서비스가 특정 조건에서 호출되며 ok 또는 nok의 간단한 응답을받습니다. 괜찮 으면 내부 개체 상태를 업데이트해야하며 nok라면 지금은 아무 것도하지 않습니다.

다음은 클래스입니다.이 클래스는 paramters로 String 목록의 목록을 가져와 컨트롤러에서 처리 할 미래의 개체 목록을 반환합니다.

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) 응답이 정상인지 또는 실패했는지 확인하는 방법은 무엇입니까?

답변

0

이 블록이 List[Future[Json]]을 반환하는 것처럼 보이면 "List[Future] to Future[List] disregarding failed futures" 또는 그 유사 물을 사용할 수 있습니다. 이렇게하려면

당신은 (오히려 다음 IsDefined/GET 이상)지도와 flatMap을 사용해야합니다

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 

사용 맵은 옵션 모나드에서 당신을 유지 :

scala> (None: Option[Int]).map(_ * 2) 
None: Option[Int] 
관련 문제