如何在 Swift 3 的 POST 请求中发送表单数据

Posted

技术标签:

【中文标题】如何在 Swift 3 的 POST 请求中发送表单数据【英文标题】:How to send form data in POST request in Swift 3 【发布时间】:2017-09-15 11:14:22 【问题描述】:

我正在尝试使用 web 服务、用户名和密码发布表单数据,但作为响应,它显示一个错误,指出“无法连接到服务器。”。

请帮我在 POST 请求中发送表单数据。

        let dict:[String:String] = ["userName": userName as! String, "password": password as! String]

        do 

            let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)

            let url = URL(string: "(some url)")!

            var request  = URLRequest(url: url)

            request.httpMethod = "POST"

            request.setValue("application/x-www-form-urlencoded charset=utf-8", forHTTPHeaderField: "Content-Type")

            request.httpBody = jsonData

            let task = URLSession.shared.dataTask(with: request)  data, response, error in

                if error != nil 

                    print(error!.localizedDescription)

                    return

                

                do 

                    let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

                    if let parseJSON = json 

                        let resultValue:String = parseJSON["success"] as! String;

                        print("result: \(resultValue)")

                        print(parseJSON)

                    

                 catch let error as NSError 

                    print(error)

                
            

            task.resume()

         catch 

            print(error.localizedDescription)

        

我尝试在请求中添加值,可能是形成的请求中缺少某些值。请帮忙!

Thats the POSTMAN response

【问题讨论】:

还可以查看 AlamoFire pod,以更轻松地完成此操作。 @TheValyreanGroup 使用过 Alamofire,同样的问题也发生在那里。 API 在 POSTMAN 中运行良好 @TheValyreanGroup: 我的代码: let urlString = "xxx.xxxx.xxxx.xxx/login" let headers = [ "Content-Type": "application/form-data" ] Alamofire.request(urlString, method: .post , 参数: ["userName": userName,"password": password], 编码: JSONEncoding.default, headers: headers).responseJSON response in switch response.result case .success: print(response) break case .failure(让错误):打印(错误) @TheValyreanGroup 工作。我的请求如下: Alamofire.request(urlString, method: .post, parameters: param).responseJSON response in ,其中 param 是字典 & urlString 是 url。让参数:[字符串:字符串] = [“用户名”:“xxxx”,“密码”:“xxxx”] @TheValyreanGroup 你得到这个答案了吗? 【参考方案1】:

我的调用 api 类

class ApiService

    static func getPostString(params:[String:Any]) -> String
    
        var data = [String]()
        for(key, value) in params
        
            data.append(key + "=\(value)")
        
        return data.map  String($0) .joined(separator: "&")
    

    static func callPost(url:URL, params:[String:Any], finish: @escaping ((message:String, data:Data?)) -> Void)
    
        var request = URLRequest(url: url)
        request.httpMethod = "POST"

        let postString = self.getPostString(params: params)
        request.httpBody = postString.data(using: .utf8)

        var result:(message:String, data:Data?) = (message: "Fail", data: nil)
        let task = URLSession.shared.dataTask(with: request)  data, response, error in

            if(error != nil)
            
                result.message = "Fail Error not null : \(error.debugDescription)"
            
            else
            
                result.message = "Success"
                result.data = data
            

            finish(result)
        
        task.resume()
    

以及何时使用

ApiService.callPost(url: url, params: params, finish: finishPost)

和结束函数

func finishPost (message:String, data:Data?) -> Void

    do
    
        if let jsonData = data
        
            let parsedData = try JSONDecoder().decode(Response.self, from: jsonData)
            print(parsedData)
        
    
    catch
    
        print("Parse Error: \(error)")
    

【讨论】:

经过两天的努力终于

以上是关于如何在 Swift 3 的 POST 请求中发送表单数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 POST 请求 iOS Swift 3 发送嵌套 JSON

使用 Alamofire 3.0+ 在 swift 2.2 中使用 JSON 对象发送 POST 请求

如何在 swift 中使用嵌套字典发送 POST 请求

如何在 Alamofire 4.0 中仅使用参数和正文在 swift 中使用 POST 方法发送请求?

Swift 3 URLSession 发送空请求

Swift 3 如何使用 Vapor 发送多部分发布请求