cURL转Swift
粘贴curl命令,得到用URLSession发出同样请求的Swift代码。
cURL转Swift在浏览器中解析你的命令,令牌和凭据不会离开你的设备。
试试API客户端
关于 cURL转Swift
API文档说的是curl,iOS应用说的是URLSession,手工翻译是件重复而容易出小错的活:漏掉一个请求头、该做JSON的请求体留成了字符串、认证参数被悄悄忽略。这个转换工具按curl自己的规则解析命令,包括那些会改变方法或把凭据折进请求头的参数,并生成只依赖Foundation的Swift代码。JSON请求体会写成Swift字典再交给JSONSerialization,而不是一串不透明的字符串。
功能特性
- 按curl的规则解析-X、-H、-d、--data-raw、--json、-u、-b、-A、-e和-G
- 生成除Foundation之外无需任何依赖的URLSession代码
- JSON请求体写成Swift字典并用JSONSerialization编码
- 基本认证由凭据重新拼装,代码里使用base64EncodedString
- 有请求体时自动推断方法,或直接取自-X
- 对没有合理Swift对应写法的curl参数给出提示
- 可复制代码或下载为.swift文件
如何使用 cURL转Swift
- 连同参数和请求体一起粘贴curl命令
- 在右侧阅读生成的Swift代码
- 查看提示,确认有没有参数无法翻译
- 复制代码或下载为.swift文件
示例
输入
curl https://api.example.com/users -H 'Content-Type: application/json' -d '{"name":"Ada"}'
输出
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
方法由是否有请求体推断得出,和curl的判断方式一致。
常见错误与故障排除
- curl里能跑,应用里却失败。 — 请检查App Transport Security。iOS默认阻止明文HTTP,所以curl能访问的http://端点需要在Info.plist里开例外,或者改用https。
- 代码能编译,却什么都没打印。 — URLSession是异步的。在命令行工具里,完成回调还没跑进程就结束了:保持运行循环,或改用async/await形式的data(for:)。
- -k或--insecure参数被忽略了。 — 这是有意为之。跳过证书校验需要URLSessionDelegate,这个决定应该由你显式作出。
- 请求体里的特殊字符不对。 — 请检查原命令的引号。用双引号包起来的请求体已经先经过了你的shell。
常见问题
- 生成的Swift能在iOS、macOS和Linux上运行吗?
- 可以。它使用Foundation的URLSession,苹果平台原生支持,Linux上有swift-corelibs-foundation,同一个文件在服务端项目里也能编译。
- 能生成async/await而不是完成回调吗?
- 生成的是带完成回调的数据任务,到处都能用。改成`let (data, response) = try await URLSession.shared.data(for: request)`只是一行的事。
- JSON请求体是怎么处理的?
- 先解析再写成Swift的[String: Any]字典,然后用JSONSerialization编码。这样负载依旧可读,改值也不用碰转义字符串。
- -b带的cookie会怎样?
- 会变成请求上的Cookie头。要注意URLSession自带cookie存储,若不另行配置可能会追加或覆盖。
- 我的curl命令会被发送出去吗?
- 不会。命令在你的浏览器里解析、代码也在本地生成——这一点很要紧,因为文档和日志里的curl命令常常带着真实的API密钥。
相关工具
全部 ArrayKit 工具