【发布时间】:2021-02-02 21:46:04
【问题描述】:
我正在尝试转换 curl 命令,以便在我正在制作的 ios 应用程序中快速使用它。我正在使用游乐场项目来试用此功能。
curl命令如下:
curl -L -X POST 'https://myurl.com/mydata' \-H 'x-api-key: xxx' \-H 'Content-Type: application/json' \-d '{"uniqueNumber": “F4”}’
当我将它输入到终端时,我的数据就会显示出来。
我浏览过stackoverflow并设法找到像this和this这样的文章
我对 swift 还是很陌生,据我了解,curl 在 swift 中不起作用,因此您必须将其转换为 URLRequest。
我已尝试使用下面的代码进行此操作,但不断收到一条消息,显示“缺少身份验证令牌”。我做错了什么?
import PlaygroundSupport
import Foundation
let key = "xxx"
let url = URL(string: "https://myurl.com/mydata")
let contentType = "application/json"
let uniqueNumber = "F4"
var request = URLRequest(url: url!)
request.addValue("x-api-key: \(key)", forHTTPHeaderField: "-H")
request.addValue("Content-Type: \(contentType)", forHTTPHeaderField: "-H")
request.addValue("uniqueNumber: \(uniqueNumber)", forHTTPHeaderField: "-d")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard error == nil else {
print(error!)
return
}
guard let data = data else {
print("Data is empty")
return
}
let json = try! JSONSerialization.jsonObject(with: data, options: [])
print(json)
}
task.resume()
PlaygroundPage.current.needsIndefiniteExecution = true
- 更新-
发现问题。我必须包含 requestHTTP 方法以及 httpBody。完成此操作后,它可以完全正常工作。工作代码见下文:
import PlaygroundSupport
import Foundation
let key = "xxx"
let url = URL(string: "https://myurl.com/mydata")
let contentType = "application/json"
//setting and converting the uniqueNumber (input) to a data item so it can be recognized by the API
var uniqueNumber: Data? = "{\"uniqueNumber\": \"F09\"}".data(using: .utf8) // non-nil
var request = URLRequest(url: url!)
request.httpMethod = "POST"
request.addValue(key, forHTTPHeaderField: "x-api-key")
request.addValue(contentType, forHTTPHeaderField: "Content-Type")
request.httpBody = uniqueNumber
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard error == nil else { print(error!.localizedDescription); return }
guard let data = data else { print("Empty data"); return }
if let str = String(data: data, encoding: .utf8) {
print(str)
}
}.resume()
PlaygroundPage.current.needsIndefiniteExecution = true
【问题讨论】: