2012-07-24 81 views
2

我在Play中創建一個Scala函數!驗證請求到我的網絡服務的應用程序。認證基本上是HMAC認證。該方法接收要使用的bodyParser的類型。由於我不知道-bodyParser的類型,我如何將request.body轉換爲可以運行我的MD5處理的通用Array [Byte]?如何將request.body轉換爲字節數組以計算MD5?

def Authenticated[T](authType : AuthenticationType, bodyParser : BodyParser[T])(f : (Request[T]) => Result) = { 

    Action(bodyParser) { request => 

     // Authentication logic starts here 

     // TODO: Something like: var bodyData : Array[Byte] = request.body.toByteArray() 

     // The rest is easy... 
     var contentMD5 = calculateMD5(bodyDat) 
     f(request) 
    } 
} 
+0

見http://stackoverflow.com/questions/4905393/scala-inputstream-to-arraybyte – 2012-07-24 04:33:23

回答

0

由播放接收的任何請求的身體可被解析到一個Http.RawBuffer,可以給你的請求主體的純原始字節數組表達。

的您正在尋找這行代碼是

var bodyData : Array[Byte] = request.body.asRaw.asBytes() 
+0

這是唯一真正當BodyParser的類型是AnyContent。因爲在我的情況下,BodyParser的類型是T,它也意味着request.body是T類型的,並且由於T是未知的,因此它沒有'asRaw'方法。 – Lior 2012-07-25 20:59:51

+0

我不確定這裏玩的Scala細節(雙關意圖),但是在這裏將'T'改成'T extends AnyContent'不是一個可行的解決方案嗎?現在您要問如何將任意JVM類型轉換爲純字節表示形式,這當然不會有微不足道的答案。無論你得到什麼類型,至少應該從一個基類中擴展出來,它爲你提供了一些幫助轉換爲字節數組的基礎知識。 – DCKing 2012-07-27 07:49:11

+0

我確信它可以完成,因此問題。可能會在請求上迭代一些東西(http://www.playframework.org/documentation/2.0/Iteratees)。 – Lior 2012-08-12 03:20:52

相關問題