带有 Alamofire POST(内容类型 JSON)的 iOS OS 10.3.3 问题

Posted

技术标签:

【中文标题】带有 Alamofire POST(内容类型 JSON)的 iOS OS 10.3.3 问题【英文标题】:iOS OS 10.3.3 with Alamofire POST (content type JSON) Issue 【发布时间】:2017-08-07 14:24:30 【问题描述】:

我一直在开发 ios 应用并使用 Alamofire 4.0 / Swift 3.1 / Xcode 8.3.3 调用我的网络服务。

在我的 iPhone 运行 OS 10.0 之前,一切似乎都运行良好。我今天将我的 iPhone 更新到 10.3.3,突然我的网络服务停止工作。

这是我一直在使用的代码:

class func verifyLoginCredentials(_ username: String, password: String, completion: @escaping (_ type: ResponseType , _ response : Int, _ message: String) -> Void) 

        var serviceURL = baseURL + "&task=login&email=" + username + "&pwd=" + password
        serviceURL = serviceURL.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!
        let url = URL(string: serviceURL)
        let authHeader = ["":""]

        print(url!)

        request(url!, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: authHeader).responseJSON(options:

        JSONSerialization.ReadingOptions.mutableContainers)  (serverResponse) -> Void in
            switch serverResponse.result 
            case .success(let JSON):

                debugPrint(JSON)

                if (JSON as AnyObject).value(forKey: "status") as! Int == 1 
                    completion( ResponseType.kresponseTypeSuccess,(JSON as AnyObject).value(forKey: "status") as! Int, "")
                    // Set User Session
                    CFunctions.setLoginSession(JSON as AnyObject)
                 else 
                    completion( ResponseType.kresponseTypeSuccess,(JSON as AnyObject).value(forKey: "status") as! Int, (JSON as AnyObject).value(forKey: "response") as! String)
                

            case .failure(let error):

                let dataString = String(data: serverResponse.data!, encoding: String.Encoding.utf8)
                print("verifyLoginCredentials Request failed with error: \(String(describing: dataString))")
                completion(ResponseType.kResponseTypeFail, error._code, "Service failed")

            

        
    

这是我在控制台中得到的:

http://198.1.109.253/~ecc2014/api/?verifyKey=abcdefghijklmnopqrstuvwxyz&task=login&email=user@yopmail.com&pwd=secret
verifyLoginCredentials Request failed with error: Optional("<!DOCTYPE html PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>400 Bad Request</title>\n</head><body>\n<h1>Bad Request</h1>\n<p>Your browser sent a request that this server could not understand.<br />\n</p>\n<hr>\n<address>Apache/2.4.27 (cPanel) OpenSSL/1.0.2k mod_bwlimited/1.4 Server at 198.1.109.253 Port 80</address>\n</body></html>\n")

我想在这里再提一件事。我的 Web 服务以前是从旧域 (http://www.exoticcarclub.net/api/?) 调用的。现在我的网络服务已经移到了一个新的服务器上,它的域名还没有被指出,所以他们给了我http://198.1.109.253/~ecc2014/api/?替换为。我想这也可能是罪魁祸首。

有人能指出 OS 10.3.3 中发生了什么吗?任何帮助将不胜感激。谢谢。

【问题讨论】:

停止工作是什么意思?你得到一个错误还是什么? 更新了我的问题。 该错误似乎与您的代码无关。这要么是后端问题,要么是在迁移服务器时请求已更改,您需要更新代码以匹配新的请求格式。 好吧,我想通了。我刚刚删除了let authHeader = ["":""] 行并从请求行中删除了headers: authHeader 参数,最后删除了(options: JSONSerialization.ReadingOptions.mutableContainers) 并且它起作用了。 是的,怀疑这是一个配置错误。 mutableContainers 选项在 Swift 中没有用,您可以通过使用 letvar 关键字声明 JSON 对象来控制它的可变性。 【参考方案1】:

我想我自己想通了。

    刚刚删除了let authHeader = ["":""] 行。 从请求行中删除了 headers: authHeader 参数。 终于删除了(options: JSONSerialization.ReadingOptions.mutableContainers)

【讨论】:

我在标题中传递空白参数时犯了同样的错误。谢谢..

以上是关于带有 Alamofire POST(内容类型 JSON)的 iOS OS 10.3.3 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire 发送带有压缩内容的 HTTP POST 请求?

alamofire:带有标头的 POST 请求

带有标头的 Alamofire POST 请求

带有 CRUD/Rest 的 Alamofire POST 参数

使用 alamofire 将带有 JSON 对象和查询参数的 POST 请求发送到 REST Web 服务

带有 Swift 3 的 Alamofire 4.3,POST 请求不适用于 URL 参数