如何在 Vapor 4 中将正文(ByteBuffer)解码为内容?

bod*_*ich 4 json decode swift vapor

当 ResponseReceipt 符合此处的内容协议时,我可以轻松解码 response.content,如 Vapor 文档中所述。

let receipt = try? response.content.decode(ResponseReceipt.self)
Run Code Online (Sandbox Code Playgroud)

但是使用Vapor的工具来解码response.body并不那么容易理解,因为它是ByteBuffer。如何以与 Vapor 类似的方式解码response.body?

imi*_*ike 7

首先,重要的是要了解 ByteBuffer 是一种字节集合,因此您可以从中读取字节并尝试Data像这样初始化

guard let byteBuffer = req.body.data else { throw Abort(.badRequest) }
let data = Data(buffer: byteBuffer)
let receipt = try JSONDecoder().decode(ResponseReceipt.self, from: data)
Run Code Online (Sandbox Code Playgroud)

或者像这样

guard let byteBuffer = response.body.data else { throw Abort(.badRequest) }
guard let data = byteBuffer.getData(at: 0, length: byteBuffer.readableBytes) else { throw Abort(.badRequest) }
let receipt = try JSONDecoder().decode(ResponseReceipt.self, from: data)
Run Code Online (Sandbox Code Playgroud)

但是使用 Vapor,您有两种更方便​​的方法来解码字节缓冲区

选择您更喜欢哪一款

guard let byteBuffer = response.body.data else { throw Abort(.badRequest) }
let receipt = try JSONDecoder().decode(ResponseReceipt.self, from: byteBuffer)
Run Code Online (Sandbox Code Playgroud)

多一个

guard let byteBuffer = response.body.data else { throw Abort(.badRequest) }
guard let receipt = try byteBuffer.getJSONDecodable(ResponseReceipt.self, at: 0, length: byteBuffer.readableBytes)
Run Code Online (Sandbox Code Playgroud)

还有一个

guard let byteBuffer = response.body.data else { throw Abort(.badRequest) }
guard let receipt = try byteBuffer.getJSONDecodable(ResponseReceipt.self, decoder: JSONDecoder(), at: 0, length: byteBuffer.readableBytes)
Run Code Online (Sandbox Code Playgroud)