【问题标题】:Convert CURL command to URLRequest将 CURL 命令转换为 URLRequest
【发布时间】: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并设法找到像thisthis这样的文章

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

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    你需要像这样设置标题...

    request.addValue(key, forHTTPHeaderField: "x-api-key")
    request.addValue(contentType, forHTTPHeaderField: "Content-Type")
    request.addValue(uniqueNumber, forHTTPHeaderField: "uniqueNumber")
    

    您为请求设置了无效的标头。

    编辑

    您还需要在标题中添加 Authentication Token,如下所示。

    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 标头字段更改为“授权”时,我收到一条更长的消息:“授权标头需要“凭据”参数。授权标头需要“签名”参数。授权标头需要“签名标头”参数。授权标头需要存在'X-Amz-Date' 或 'Date' 标头。 Authorization=xxx" 我不知道这些:/
    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多