Curly

这个包将 Perfect-CURL 封装成 Vapor 3 的 Client。 如果你在 Linux 上遇到 URLSession 问题,或者你想要 cookie 或代理支持,这可能是一个解决方案。

用法

0. (Linux) 安装 libcurl 开发包

这个包依赖于 libcurl4 的开发包。 请确保在尝试构建你的 Swift 项目之前,你已经安装了 libcurl4-openssl-dev

sudo apt-get update
sudo apt-get install libcurl4-openssl-dev

1. 将此包作为依赖项添加到你的 Vapor 3 项目中

// swift-tools-version:4.0
import PackageDescription

let package = Package(
    name: "VaporApp",
    dependencies: [
        // 💧 A server-side Swift web framework.
        .package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"),
        .package(url: "https://github.com/vzsg/Curly.git", from: "0.6.0"),
        // ... other dependencies ...
    ],
    targets: [
        .target(name: "App", dependencies: ["Vapor", "...", "CurlyClient"]),
        // ... other targets ...
    ]
)

2. 注册 CurlyProvider

// Typically, this is part of configure.swift
import Vapor
import CurlyClient
// ... other imports ...


public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
    try services.register(CurlyProvider())
    config.prefer(CurlyClient.self, for: Client.self)

    // ... other configuration ...
}

3. 享受成果!

现在你的 Vapor 应用程序直接使用 curl 而不是 URLSession。

4. 额外成果:CurlyOptions

从 0.3.0 开始,Curly 公开了一些 cURL 中有用的选项,这些选项在 Client 接口甚至 URLSession 中都不可用。 要使用它们,你必须按照步骤 2 中所示注册 Curly 通过 CurlyProvider

完成上述操作后,你可以在使用 Client 的便捷函数时调用 Request.addCurlyOptionbeforeSend 闭包中,或者在使用 Client.send() 和自建的 Request 对象时在 Request 实例本身上调用。
这两种方法在功能上是等效的。

try client.get("https://self-signed.badssl.com/", beforeSend: { req in
    req.addCurlyOption(.sslVerifyPeer(false))
})
var http = HTTPRequest(method: .GET, url: "https://self-signed.badssl.com/")
http.headers.replaceOrAdd(name: "X-Test-Header", value: "Foo")

let req = Request(http: http, using: app)
req.addCurlyOption(.sslVerifyPeer(false))

try client.send(req)

警告: 在没有 Provider 的情况下调用 Request.addCurlyOption 将导致调试构建中的致命错误,并在发布构建中打印警告。

从 0.7.0 开始,可以使用 CurlyProvider 的新的 globalOptions 可选参数将选项应用于通过 Curly 发出的所有请求。

try services.register(CurlyProvider(globalOptions: [
    .sslCAFilePath("my-selfsigned-certs.crt")
]))

可用选项