Ios 将CURL命令转换为URLRequest

Ios 将CURL命令转换为URLRequest,ios,swift,Ios,Swift,我正在尝试转换curl命令,以便在swift中为我正在制作的ios应用程序使用它。我正在使用一个游乐场项目来尝试此功能 curl命令如下所示: curl -L -X POST 'https://myurl.com/mydata' \-H 'x-api-key: xxx' \-H 'Content-Type: application/json' \-d '{"uniqueNumber": “F4”}’ 当我把它输入终端时,我的数据就会显示出来 我浏览了stackoverflo

我正在尝试转换curl命令,以便在swift中为我正在制作的ios应用程序使用它。我正在使用一个游乐场项目来尝试此功能

curl命令如下所示:

curl -L -X POST 'https://myurl.com/mydata' \-H 'x-api-key: xxx' \-H 'Content-Type: application/json' \-d '{"uniqueNumber": “F4”}’
当我把它输入终端时,我的数据就会显示出来

我浏览了stackoverflow,找到了像和这样的文章

我对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

你需要像这样设置标题

request.addValue(key, forHTTPHeaderField: "x-api-key")
request.addValue(contentType, forHTTPHeaderField: "Content-Type")
request.addValue(uniqueNumber, forHTTPHeaderField: "uniqueNumber")
您正在为请求设置无效的标题

编辑

您还需要在标头中添加身份验证令牌,如下所示

let authToken = "THIS IS AUTHENTICATION TOKEN TO BE PASSED ON SERVER"
request.addValue(authToken, forHTTPHeaderField: "authenticationToken")

//Please make sure to pass the authentication token the key "authenticationToken". 
//Please change as per actual key to be passed

感谢您的输入,我已根据您的指示更改了标题,但我似乎仍然收到相同的错误消息“缺少身份验证令牌”。我已根据您的编辑添加了authToken。我不确定我的令牌是什么,因为我只有一个API密钥来与这个API通信。我将authToken设置为我的API密钥,但仍然得到相同的错误。但是,当我将authenticationToken标题字段更改为“Authorization”时,我收到一条更长的消息:“授权标头需要'Credential'参数。授权标头需要“签名”参数。授权标头需要“SignedHeaders”参数。授权标头要求存在“X-Amz-Date”或“Date”标头。授权=xxx“我不知道这些:/