swift - 如何在 Swift4+ 中作为标准 POST 方法发送数组数组

标签 swift post request insomnia

Insomnia 处生成的 Swift 代码适用于 1 个和 1 个,但始终给出一个 2+ 个出现错误。 如何在 Swift4+ 中以 POST 方法发送数组数组?

失眠代码:

let headers = [
  "content-type": "multipart/form-data; boundary=---011000010111000001101001",
  "accept": "application/json"
]

let parameters = [
  [
    "name": "email",
    "value": "example@gmail.com"
  ],
  [
    "name": "token",
    "value": "911"
  ]
]

let boundary = "---011000010111000001101001"

var body = ""
let error: NSError? = nil
do{
    for param in parameters {
      let paramName = param["name"]!
        body += "--\(boundary)\r\n"
      body += "Content-Disposition:form-data; name=\"\(paramName)\""
      if let filename = param["fileName"] {
        let contentType = param["content-type"]!
        let fileContent = try String(contentsOfFile: filename, encoding: String.Encoding.utf8)
        if (error != nil) {
            print(error as Any)
        }
        body += "; filename=\"\(filename)\"\r\n"
        body += "Content-Type: \(contentType)\r\n\r\n"
        body += fileContent
      } else if let paramValue = param["value"] {
        body += "\r\n\r\n\(paramValue)"
      }
    }
} catch { print(error.localizedDescription) }
let request = NSMutableURLRequest(url: NSURL(string: "https://server.../verify")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
let postData = body.data(using: .utf8)
request.httpBody = postData!

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
    if (error != nil) {
      print(error as Any)
    } else {

        let httpResponse = response as? HTTPURLResponse
        print("response: \(httpResponse!)")
        let str = String(data: data!, encoding: .windowsCP1250)
        print(str!)
    }
})
dataTask.resume()

似乎根本没有任何值传输到服务器,但是,对于 1 个值根本没有问题:

let parameters = [
      [
        "name": "email",
        "value": "example@gmail.com"
      ]
    ]

最佳答案

对于 Swift4Swift5 使用 POST 更好地发出请求:

components.queryItems = [
    URLQueryItem(name: "email", value: "example@gmail.com"),
    URLQueryItem(name: "token", value: "3909")
]

服务器没问题,语法也好,但是,据我所知,这取决于 Swift 的版本。

整个代码:

let url = URL(string: "https://server.../verify")!
var components = URLComponents(url: url, resolvingAgainstBaseURL: false)!
components.queryItems = [
    URLQueryItem(name: "email", value: "example@gmail.com"),
    URLQueryItem(name: "token", value: "3909")
]
let query = components.url!.query
var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)

request.httpMethod = "POST"
request.httpBody = Data(query!.utf8)

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error!)
  } else {
      let httpResponse = response as? HTTPURLResponse
      print("response: \(httpResponse!)")
      let str = String(data: data!, encoding: .utf8)
      print(str!)
  }
})

dataTask.resume()

关于swift - 如何在 Swift4+ 中作为标准 POST 方法发送数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59529868/

相关文章:

android - 使用回形针插件通过 Post 方法为 rails 服务器上传图像

objective-c - Swift 中的方法名称

javascript - 使用 JavaScript 发布 JSON

c# - VM 回发返回 Null 对象?

javascript - 向服务器查询文件

python - 哪个是检查请求条件的更好方法?

iOS 11 beginRefreshing 以编程方式在导航栏上使用大标题

ios - 源文件中的 Swift 编辑器占位符

ios - 数据未通过 Segue 传递

python - 检查 Django 模板中的请求获取参数