在 swift 中使用 Alamofire 的 JsonSerialization 错误

Posted

技术标签:

【中文标题】在 swift 中使用 Alamofire 的 JsonSerialization 错误【英文标题】:JsonSerialization error using Alamofire in swift 【发布时间】:2018-04-17 13:46:27 【问题描述】:

我正在调用我的注册服务,其中参数运行良好,url 也正确,我得到状态代码 200 作为响应,但是当我打印结果和响应时,它显示失败。我已经检查了注册所需的一切,一切看起来都很好,但我很困惑为什么它显示响应失败。它在响应中显示了这一点,

["FirstName": "Awais", "Email": "awais@gmail.com", "PhoneNumber": "08965235415", "Password": "123456", "LastName": "Ahmed", "ConfirmPassword": "123456"]
Request: Optional(MyURL)
Response: Optional(<NSHTTPURLResponse: 0x604000438900>  URL: http://api.theahsanzaman.info/api/Account/Register   Status Code: 200, Headers 
"Cache-Control" =     (
    "no-cache"
);
"Content-Length" =     (
    0
);
Date =     (
    "Tue, 17 Apr 2018 13:37:03 GMT"
);
Expires =     (
    "-1"
);
Pragma =     (
    "no-cache"
);
Server =     (
    "Microsoft-IIS/8.5"
);
"X-AspNet-Version" =     (
    "4.0.30319"
);
"X-Powered-By" =     (
    "ASP.NET"
);
"X-Powered-By-Plesk" =     (
    PleskWin
);
 )  


Result: FAILURE
RR FAILURE: responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)
0

1111
"FAILURE: responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)"

我的请求代码是这样的,

import SwiftyJSON
import Alamofire
import UIKit

class SignUpService

    static let instance = SignUpService()
    var status = 0

    func signUpUser(param:[String: String],completion:@escaping CompletionHandler)  

        let url = URL.init(string: SignUpUrl)
        Alamofire.request(url!, method: .post, parameters: param, encoding:JSONEncoding.default, headers: nil).responseJSON  (response) in
            print("Request: \(String(describing: response.request))")   // original url request
            print("Response: \(String(describing: response.response))") // http url response
            print("Result: \(response.result)")// response serialization result
            print("RR \(response)")

            if response.result.error == nil
                self.status = (response.response?.statusCode)!
                if(self.status == 200)
                    print("successful")

                
                completion(true)
                print("11112222")
            else
                completion(false)
                print("1111")
                debugPrint(response.description as Any)
            
        
    

我很困惑为什么如果状态码为 200 时它没有显示成功响应。

【问题讨论】:

有许多不同类型的错误。状态 200 表示错误与网络请求相关。但是inputDataNilOrZeroLength 很有意义。 "Content-Length" = (0)。您没有数据,然后 JSONSerialization 可能会导致错误并抛出该错误inputDataNilOrZeroLength。也许事先检查状态码? 我知道这是由于 responseJSON 它应该被转换为 responseString。 【参考方案1】:

在调用 API 时验证响应状态码,方法是在 alamofire 请求中添加 validate(statusCode: 200..

现在如果成功代码为 200,您的代码将失败。

    Alamofire.request(url!, method: .post, parameters: param, encoding:JSONEncoding.default, headers: nil). validate(statusCode: 200..<300).responseJSON  (response) in

        switch response.result 
        case .success(let data): 
            Logs.DLog(object: "\n Success: \(response)")

            // Do your code here...

        case .failure(let error):
            Logs.DLog(object: "\n Failure: \(error.localizedDescription)")

            // Do your code here...

        
    )

但是您没有收到响应 JSON,因此您无法解码响应 JSON。

【讨论】:

以上是关于在 swift 中使用 Alamofire 的 JsonSerialization 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift 在 Alamofire 中使用 CURL 命令

如何在swift中使用alamofire上传图库图片

如何在 Swift / Alamofire 中使用 multipartFormData?

在 swift 中使用 Alamofire 取消 api 请求

Alamofire 在 swift 中使用正文发布请求

Swift 4:如何使用 Alamofire 在参数中发布文件?