2017-10-02 5 views
0
私はFORMDATAにURLパラメータを付加し、特殊なキーと値のペアを持つsyncronous HTTPポストを作るために、アクションから次のヘルパー関数を呼び出しています

のために与えられたFORMDATAへの追加しますは、httpポスト

def act = Action { request => 
    request.body.asFormUrlEncoded match { 
     case Some(formdata) => 
     synchronousPost(url, formdata + ("handshake" -> List("ok"))) match { 

実際にはいくつかの古い要旨をコピー&ペーストであり、私はそれはきれいな方法で書き換えることができ、かなり確信している:それは、このように呼ばれています。

val params = ...はどのようにしてよりクリーンな方法で書き直すことができますか?それは低レベルのようです。

元のフォームデータはrequest.body.asFormUrlEncodedから来て、私はフォームデータマップにハンドシェイクパラメータを追加して元の要求を送信者に送り返し、ハンドシェイクを行います。それはだときAwaitを使用する

val future: Future[WSResponse] = ws.url(url) 
    .withHttpHeaders(("Content-Type", "application/x-www-form-urlencoded")) 
    .post(formdata) 

ところで、それは考えられています悪いフォーム:formdata以来

+1

ことができますだけでなく 'ポスト(FORMDATA)'直接文字列に変換せず? Map [String、Seq [String]] 'data [提供]には' WSBodyWritable'があります(https://github.com/playframework/play-ws/blob/b95e3483fed79c063accbe88e8734d9b6db9d33a/play-ws-standalone/src/main /scala/play/api/libs/ws/DefaultBodyWritables.scala#L107) – Mikesname

+0

@Mikesname:とても簡単です!私が言ったように、その要点はかなり古い...実際の答えを加えたいですか?それ以外の場合、私は質問を取り消すだろう... – Bastl

答えて

1

は、あなたは、単に要求を直接体として使用することができ、Map[String, Seq[String]]、デフォルトWSBodyWritableが提供されているデータ型でありますプレイコントローラを作るのは簡単では返すFuture[Result]Action.asyncを使用して、例えば:

def asyncPost(url: String, formdata: Map[String, Seq[String]]): Future[String] = { 
    ws.url(url) 
    .withHttpHeaders(("Content-Type", "application/x-www-form-urlencoded")) 
    .post(formdata) 
    .map(_.body) 
} 

def action = Action.async { request => 
    request.body.asFormUrlEncoded match { 
    case Some(formdata) => 
     asyncPost(url, formdata + ("handshake" -> List("ok"))).map { body => 
     Ok("Here is the body: " + body) 
     } recover { 
     case e => 
      Logger.error(e) 
      InternalServerError(e.getMessage) 
     } 
    case None => Future.successful(BadRequest("No form data given")) 
    } 
} 
関連する問題