Swift - 使用 alamofire 发布请求

Posted

技术标签:

【中文标题】Swift - 使用 alamofire 发布请求【英文标题】:Swift - post requests with alamofire 【发布时间】:2018-06-27 09:59:09 【问题描述】:

我在使用 Alamofire 时遇到了一点问题。我有在安卓设备上成功运行的服务器功能。一切正常,所有数据都正常工作。但是在 ios 上,每次我发送带有超过 2 个参数的发布请求时,我都会从服务器收到错误,所以我无法发布数据。我尝试将 post 作为自定义编码中的字符串,因为当我将参数放入 Alamofire.request 方法时,我也收到了一个错误,但是服务器响应是“unexeption 处理程序中的错误”。所以我把所有的JSON都改成了字符串,这要归功于String扩展,然后我把每个“[”和“]”都改成了“”、“”,但我仍然无法将数据保存到服务器。

编码字典并在 Swift 中转换为 JSON 如下所示:

通话次数=%7B%220%22%3A%7B%22call%5Fdate%22%3A%222018%2D06%2D27%2B11%3A30%3A46%22%2C%22number%22%3A%22462462432%22% 2C%22sms%22%3A%220%22%2C%22duration%22%3A%220%22%2C%22type%22%3A211%7D%7D

Swift 中的字典

["calls": ["0": ["call_date": "2018-06-27+11:49:18", "number": "56262621", "sms": "0", "duration": "0", "type": 211]]]

另一方面,android 上的相同应用程序可以完美地处理相同的数据。

Java 中编码的 JSON 如下所示:

通话次数=%7B%220%22%3A%7B%22number%22%3A%22852486258965%22%2C%22duration%22%3A%220%22%2C%22type%22%3A211%2C%22call_date% 22%3A%222018-06-27+11%3A53%3A53%22%2C%22sms%22%3A%220%22%7D%7D

Java 中的 JSON

"calls":"0":"number":"852486258965","duration":"0","type":211,"call_date":"2018-06-27 11:53:53","sms":"0"

为什么在 Android 应用中一切正常,但在 iOS 上却完全不起作用?有人对此有想法吗?

Swift 中的函数

func sendStoreCalls(parameters: Dictionary<Int, Dictionary<String, Any>>) 

        var params: Parameters = [:]
        var par: Parameters = [:]
        var pa: [String:Any] = [:]
        var i = 0
        for (_, param) in parameters 
            if param["isSend"] as! Int == 0 
                par["duration"] = param["callTime"]
                par["sms"] = "0"
                let callDate: String = param["callDate"] as! String
                par["type"] = param["callType"]
                par["call_date"] = callDate.replacingOccurrences(of: " ", with: "+", options: .literal, range: nil)
                if param["callNumber"] as! String != "" 
                    par["number"] = param["callNumber"]
                
                params[String(i)] = par
                i += 1
            
        

        pa["calls"] = params

        let token: String = SharedPreferences.getPrefToken()!

        let bufferedParams = pa.queryParameters

        let transformedPar = bufferedParams.replacingOccurrences(of: "%5B", with: "%7B", options: .literal, range: nil).replacingOccurrences(of: "%5D", with: "%7D", options: .literal, range: nil)

        let trn = transformedPar.replacingOccurrences(of: "%C2A0", with: "", options: .literal, range: nil).replacingOccurrences(of: "%20", with: "", options: .literal, range: nil)

        let url = "https://url.com?api_token=\(token)"

        Alamofire.request(url, method: .post, encoding: JSONStringArrayEncoding.init(string: trn))
            .responseJSON 
                response in
                print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue)!)
                switch response.result 
                case .success(let value):
                    let json = JSON(value)
                    print(json["message"].rawString()!)
                case .failure(let error):
                    if let data = response.data 
                        print("ERROR!!!")
                        print(String(data: data, encoding: String.Encoding.utf8)!)
                    
                    print(error)
                
            
    

【问题讨论】:

【参考方案1】:

尝试使用/不使用编码参数以及添加/删除标头[“Content-Type”:“application/json”]的此方法

func request(_ method: HTTPMethod
    , _ URLString: String
    , parameters: [String : AnyObject]? = [:]
    , headers: [String : String]? = [:]
    , onView: UIView?, vc: UIViewController, completion:@escaping (Any?) -> Void
    , failure: @escaping (Error?) -> Void) 


    Alamofire.request(URLString, method: method, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
        .responseJSON  response in

            switch response.result 
            case .success:
                completion(response.result.value!)
            case .failure(let error):
                failure(error)
                guard error.localizedDescription == JSON_COULDNOT_SERIALISED else 
                    AppUtil().showMessage((error.localizedDescription), messageTitle: EMPTY_STRING, buttonTitle: OK, vc: vc)
                    return
                
                //                    AppUtil.showMessage(SOMETHING_WNET_WRONG, messageTitle: EMPTY_STRING, buttonTitle: OK)
            
    

【讨论】:

谢谢!你帮了我很多。当我向我的 Alamofire.request 添加:参数:pa,编码:JSONEncoding.default,标题:[“Content-Type”:“application/json”]时,我终于得到了成功的响应!感谢您的帮助。

以上是关于Swift - 使用 alamofire 发布请求的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 不能使用数组提出的 Alamofire 请求

在 swift 中使用 Alamofire 取消 api 请求

使用 Alamofire 和 Mapkit Swift 3 请求

带有 XML 响应和正文的 SOAP 请求 swift 3,Alamofire

ios swift 3 Alamofire 发布请求问题

POST 请求 Swift 3.0 Alamofire