2012-07-24 30 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

相关问题