読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

Play2.0 で一部ハマったのでメモ

OSS Tips Playframework

忘れると色々ヒーヒー言いそうなのでメモ

WS.irl("http://localhost/sample/xxxx").withHeader("Content-Type" -> "text/plain").post(byteArray)

でバイナリを自身のサービスにファイルを送りつけてもコントローラ側で

val sendedBytes = sample.body.asRaw.get.asBytes()

バイナリとして拾う分に拾えないことは無いはずという思い込みでやってたら、拾えなくて地獄を見た。
あんまり悩んで切れて、asRaw の実装どないなってんねんと思ってソースを読んだらContentType.scala

    /**
     * Guess the body content by checking the Content-Type header.
     */
    def anyContent: BodyParser[AnyContent] = BodyParser("anyContent") { request =>
      request.contentType match {
        case _ if request.method == "GET" || request.method == "HEAD" => {
          Logger("play").trace("Parsing AnyContent as empty")
          empty(request).map(_.right.map(_ => AnyContentAsEmpty))
        }
        case Some("text/plain") => {
          Logger("play").trace("Parsing AnyContent as text")
          text(request).map(_.right.map(s => AnyContentAsText(s)))
        }
        case Some("text/xml") => {
          Logger("play").trace("Parsing AnyContent as xml")
          xml(request).map(_.right.map(x => AnyContentAsXml(x)))
        }
        case Some("text/json") | Some("application/json") => {
          Logger("play").trace("Parsing AnyContent as json")
          json(request).map(_.right.map(j => AnyContentAsJson(j)))
        }
        case Some("application/x-www-form-urlencoded") => {
          Logger("play").trace("Parsing AnyContent as urlFormEncoded")
          urlFormEncoded(request).map(_.right.map(d => AnyContentAsFormUrlEncoded(d)))
        }
        case Some("multipart/form-data") => {
          Logger("play").trace("Parsing AnyContent as multipartFormData")
          multipartFormData(request).map(_.right.map(m => AnyContentAsMultipartFormData(m)))
        }
        case _ => {
          Logger("play").trace("Parsing AnyContent as raw")
          raw(request).map(_.right.map(r => AnyContentAsRaw(r)))
        }
      }
    }

ぎゃー!なんてこったいオリーブ、、、、特定のContentTypeに反応してデータ形式を指定していたのですね、、、、。

教訓。
こんなのわかんねーって言って海外サイト回るより、原本ソース読むほうが早い。