Vapor文档学习卅: HTTP -ResponseRepres

2017-04-24  本文已影响40人  Supremodeamor

传统的HTTP服务器就是得到Request然后返回Response。Vapor也是没什么不同,但是我们利用Swift强大的协议功能使用户面对API时更加灵活。
让我们从ResponseRepresentable的定义开始学习:

public protocol ResponseRepresentable {
    func makeResponse() throws -> Response
}

通过遵守此协议,我们可以更加灵活的返回一些符合要求的内容,而不必每次都手动创建Response。Vapor提供了一些默认的类型,但是并不限于这些。

String

由于String遵守了ResponseRepresentable协议,所以我们可以直接在Vapor路由处理中返回它。

drop.get("hello") { request in
  return "Hello, World!"
}

JSON

可以直接返回JSON而不必每次都手动创建响应。

drop.get("hello") { request in
  return try JSON(node: [
      "hello": "world",
      "some-numbers": [
        1,
        2,
        3
      ]
    ]
  )
}

Response

当然我们可以使用Response返回任何没有包括的内容。

drop.get("hello") { request in
  return Response(status: .ok, headers: ["Content-Type": "text/plain"], body: "Hello, World!")
}

Comforming

如果要返回我们自定义的类型,只需要遵守ResponseRepresentable协议。下面我们来看一个简单的博客模型类案例。

import Foundation

struct BlogPost {
  let id: String
  let content: String
  let createdAt: NSDate
}

然后使其遵守ResponseRepresentable协议:

import HTTP
import Foundation

extension BlogPost: ResponseRepresentable {
  func makeResponse() throws -> Response {
    let json = try JSON(node:
      [
        "id": id,
        "content": content,
        "created-at": createdAt.timeIntervalSince1970
      ]
    )
    return try json.makeResponse()
  }
}

别忘了添加“import HTTP”

现在我们创建了BlogPost模型,我们可以在路由处理程序中直接返回了。

drop.post("post") { req in
  guard let content = request.data["content"] else { throw Error.missingContent }
  let post = Post(content: content)
  try post.save(to: database)
  return post
}
上一篇 下一篇

猜你喜欢

热点阅读