这个包将 Perfect-CURL 封装成 Vapor 3 的 Client
。 如果你在 Linux 上遇到 URLSession 问题,或者你想要 cookie 或代理支持,这可能是一个解决方案。
这个包依赖于 libcurl4 的开发包。 请确保在尝试构建你的 Swift 项目之前,你已经安装了 libcurl4-openssl-dev
。
sudo apt-get update
sudo apt-get install libcurl4-openssl-dev
// 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 ...
]
)
// 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 ...
}
现在你的 Vapor 应用程序直接使用 curl 而不是 URLSession。
从 0.3.0 开始,Curly 公开了一些 cURL 中有用的选项,这些选项在 Client 接口甚至 URLSession 中都不可用。 要使用它们,你必须按照步骤 2 中所示注册 Curly 通过 CurlyProvider
。
完成上述操作后,你可以在使用 Client 的便捷函数时调用 Request.addCurlyOption
在 beforeSend
闭包中,或者在使用 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")
]))
proxy(String)
等效于 curl 的 -x
/--proxy
参数,它可以通过 HTTP、HTTPS 或 SOCKS 代理启用代理。
proxyAuth(user: String, password: String)
等效于 curl 的 -U
/--proxy-user
参数,它允许指定用于向代理服务器进行身份验证的用户名和密码。
proxyPort(Int) (0.6.0 新增)
等效于 CURLOPT_PROXYPORT
,它允许分别覆盖用于连接到代理的端口。
timeout(Int)
等效于 curl 的 -m
/--max-time
参数,它允许指定服务请求允许的最大时间(以秒为单位)。
timeoutMs(Int)
与 timeout
相同,但精度为毫秒。
connectTimeout(Int)
等效于 curl 的 --connect-timeout
参数,它允许指定连接到服务器允许的最大时间(以秒为单位)。
connectTimeoutMs(Int) (0.5.0 新增)
与 connectTimeout
相同,但精度为毫秒。
cookieJar(String)
等效于同时设置 curl 的 -b
/--cookie
和 -c
/--cookie-jar
参数。 使用该选项提供的文件名将用作此请求的 cookie 存储 - 读取和写入。 请参阅测试示例。
followRedirects(Bool)
等效于 curl 的 -L
/--location
参数,它允许自动跟随重定向。
insecure(Bool)
等效于 curl 的 -k
/--insecure
参数,它可以禁用对从远程服务器收到的证书的验证。 建议使用 sslVerifyPeer
代替。
sslVerifyPeer(Bool) (0.6.0 新增)
等效于 CURLOPT_SSL_VERIFYPEER
,用于启用或禁用服务器证书验证。
sslVerifyHost(Bool) (0.6.0 新增)
等效于 CURLOPT_SSL_VERIFYHOST
,用于启用或禁用针对服务器证书验证服务器主机名。
sslKey(path: String, type: CurlySSLFileType?, password: String?) (0.6.0 新增)
等效于 --key
、--key-type
和 --pass
参数,用于指定用于客户端证书验证的私钥。
sslCert(path: String, type: CurlySSLFileType?) (0.6.0 新增)
等效于 -E
/--cert
和 --cert-type
参数,用于指定客户端证书。
sslCAFilePath(String) (0.6.0 新增)
等效于 --cacert
参数,用于指定用于验证服务器证书的证书。
sslCADirPath(String) (0.6.0 新增)
等效于 --cadir
参数,用于指定包含用于验证服务器证书的证书的文件夹。
sslCiphers([String]) (0.6.0 新增)
sslPinnedPublicKey(String) (0.6.0 新增)
等效于 --pinnedpubkey
参数,用于指定包含 PEM/DER 编码的公钥的文件,或服务器必须在其证书链中提供的 SHA-256 哈希。