Using HTTP Message

有两种类型的HTTP消息, HTTPRequestHTTPResponse。 大多数情况下,它们非常相似,但有一些差异。

Request

HTTP请求由客户端发送到服务器,并且它们应始终只收到一个HTTP响应。 HTTP请求通过标准HTTP消息包含两个唯一字段:

该方法和URL定义了服务器上正在请求的内容。

/// GET /hello
let httpReq = HTTPRequest(method: .GET, url: "/hello")

您可以在初始化HTTP请求时定义这些参数,或者如果请求可变,则可以稍后进行设置。

var httpReq: HTTPRequest = ...
httpReq.method = .POST
httpReq.url = URL(...)

您可以使用Foundation的URLComponents从其基本组件创建URL。 HTTP请求也有一个属性 urlString 您可以使用它来手动设置一个自定义URLString,而不需要通过URL

以下是一个序列化的HTTP请求的样子。这个是查询/hello

GET /hello HTTP/1.1
Content-Length: 0

Response

HTTP响应由服务器响应HTTP请求而生成。 HTTP响应在通用HTTP消息中只有一个唯一字段:

HTTP状态用于通知客户端有什么错误。状态由状态码和错误原因组成。代码总是三位数字,原因是解释代码的短字符串。您可以在 httpstatuses.com 上查看所有状态码。

let httpRes = HTTPResponse(status: .ok, body: "hello")

所有常用的HTTP状态都会有预定义的值,比如.ok代表200 OK。您还可以定义自己的自定义状态代码。

您可以在初始化HTTP响应时定义状态,或者如果响应是可变的,则可以稍后进行设置

var httpRes: HTTPResponse = ...
httpRes.status = .notFound

这是一个序列化的HTTP响应的例子。

HTTP/1.1 200 OK
Content-Length: 5
Content-Type: text/plain

hello

Headers

每个HTTP消息都有一个header集。header包含关于消息的元数据并帮助解释消息正文中的内容。

Content-Length: 5
Content-Type: text/plain

必须至少有一个 "Content-Length" 或者 "Transfer-Encoding" headers来定义消息正文的长度。几乎总是有一个 "Content-Type" headers,它解释了正文包含的数据的 type 。还有许多其他常见的headers,如指定消息何时被创建的 "Date" 等等。

您可以使用“headers”属性访问HTTP消息的headers。

var message: HTTPMessage ...
message.headers.firstValue(for: .contentLength) // 5

如果您正在使用常见的HTTP header进行交互,则可以使用便捷的HTTP名称而不是原始的String

Body

HTTP消息可以有一个包含任意数据的 HTTPBody 。 这些数据可以是静态的也可以是流式的,并且可以是任何你想要的格式。使用 contentType header来描述数据的类型。

var message: HTTPMessage = ...
message.body = HTTPBody(string: "Hello, world!")
message.contentType = .plainText

提示

如果需要,设置 body 属性将会自动更新 "Content-Length" or "Transfer-Encoding" 的headers.

var message: HTTPMessage = ...
message.body = HTTPBody(string: """
{"message": "Hello, world!"}
""")
message.contentType = .json

Codable

定义了两个协议,以便使用HTTP协议的 Codable :

这两个编码器允许您将自定义的Codable类型编码和解码到HTTP正文中,并设置适当的内容类型headers。

默认情况下,HTTP为JSONEncoderJSONDecoder提供了一致性,但Vapor包含更多类型的编码器。

下面是一个将Codable结构编码为HTTP响应的示例。

struct Greeting: Codable {
    var message: String
}
// Create an instance of Greeting
let greeting = Greeting(message: "Hello, world!")
// Create a 200 OK response
var httpRes = HTTPResponse(status: .ok)
// Encode the greeting to the response
try JSONEncoder().encode(greeting, to: &httpRes, on: ...)

API Docs

查看 API docs 以获取所有相关方法的更深入的资料。

results matching ""

    No results matching ""