Play2.0 で一部ハマったのでメモ
忘れると色々ヒーヒー言いそうなのでメモ
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に反応してデータ形式を指定していたのですね、、、、。
教訓。
こんなのわかんねーって言って海外サイト回るより、原本ソース読むほうが早い。