2017-06-22 90 views
1

我正在使用Play 2.6-RC2,並且需要通過http調用外部組件的操作(POST)。來自Play動作的異步http請求

我在理解如何實施該操作以及如何從POST請求獲得響應方面存在問題。

這是我現在有,但我失去了如何進行:

class ABCController @Inject() 
(
    cc: ControllerComponents, 
    langs: Langs, 
    messagesApi: MessagesApi, 
    ws: WSClient 
) extends AbstractController(cc) with I18nSupport { 

    def submit = Action.async { implicit request: Request[_] => { 
    val res = ws.url("http://127.0.0.1:8111/abc").post("test") 
    // How do I get the POST response and return async?? 
    } 
} 
+0

歡迎來到SO!爲了得到更好的答案,這將有助於說明你到現在爲止所嘗試的是什麼,你希望如何迴應。給與例子將是最好的 – Mzf

+0

還沒有嘗試過任何編譯:-) –

+0

但你想用'res'做什麼?只想發送它或從中提取一些數據? – Mzf

回答

1

如果更改注入WSClient到play.api.libs.ws.WSClient那麼你會得到相同的行爲以前在2.5,post將返回Future[WSResponse],您可以在此上使用map

class ABCController @Inject() 
(
    cc: ControllerComponents, 
    langs: Langs, 
    messagesApi: MessagesApi, 
    ws: play.api.libs.ws.WSClient 
) extends AbstractController(cc) with I18nSupport { 
0

的ws.url方法返回一個Future [WSResponse],你需要映射來解決。所以,我認爲你需要做這樣的事情:

def submit = Action.async { implicit request: Request[_] => { 
val res:Future[WSResponse] = ws.url("http://127.0.0.1:8111/abc").post("test") 
res.map(wsres => { 
    Ok(wsres.json) 
}) 
} 

請參閱處理響應部件:https://www.playframework.com/documentation/2.6.x/ScalaWS

+0

我正在使用2.6,這不再是這種情況,它的這個新對象我不明白如何使用 - 它從 https:// www。 playframework.com/documentation/2.6.0-RC2/ScalaWS –

+0

據我所見,上面的代碼應該可以正常工作(即使在RC2中)。哪一部分讓你煩惱? – jsdeveloper

+0

'ws.url'返回'CompletionStage [WSResponse]'而不是'Future [WSResponse]'。 對象來自'play.libs.ws'而不是'play.api.libs.ws' - 與注入的'WSClient'相同。 –