【问题标题】:Alamofire API request is getting failed with responseSerializationFailed in swift 3Alamofire API 请求因 swift 3 中的 responseSerializationFailed 而失败
【发布时间】:2018-06-04 01:42:48
【问题描述】:

我正在使用 Alamofire 调用正常的 API 调用,并且我没有在网络管理器类中传递任何数据。

我的网络课程是

func executeGetRequest(url:String,requestVC:UIViewController,completionHandler:@escaping (_ responseObject:Any?) -> Void!,failureHandler:@escaping (_ connectionError:NSError?) -> Void!){

    //Checking internet alert
    if !self.isConnectedToInternet(){
        // requestVC.showAlert(kText_AppName, message: kText_NoInternet)
        return
    }

    requestVC.showLoader()
    Alamofire.request(url).responseJSON {
        (response:DataResponse) in

        requestVC.removeLoader()

        switch(response.result) {
        case .success(_):
            if response.result.value != nil{
                completionHandler (response.result.value)
            }
            break

        case .failure(let error):
            failureHandler (error as NSError?)
            break

        }
    }
}

我是从我的主课中调用它

kNetworkManager.executeGetRequest(url: kAppAccessTokenURL, requestVC: self, completionHandler: {
     (responseObject) -> () in
          print("responseObject:\(responseObject!)")


      }, failureHandler: {(error)-> () in
          print("response object:\(error!)")
          self.showAlert(message: (error?.description)!, title: kText_AppName)
          if error?._code == NSURLErrorTimedOut {
                //timeout here
                self.showAlert(message: kText_timeout, title: kText_AppName)
           }
      })

它总是请求失败并显示错误为responseSerializationFailed

如果我直接在主类中调用而没有像

这样的管理器类
Alamofire.request(kAppAccessTokenURL).responseString { response in

我能够得到回应,谁能建议我在网络课程中哪里出错了。

【问题讨论】:

  • Alamofire.request(kAppAccessTokenURL).responseString 之所以有效,是因为您希望您的响应是一个字符串。但是,当您要求 Alamofire 将响应序列化为 json 即调用 Alamofire.request(url).responseJSON 时,它会失败,因为您的响应不是 JSON,而是一些随机字符串
  • 那么,如何解决这个问题?
  • 检查你在Alamofire.request(kAppAccessTokenURL).responseString 中得到了什么,并告诉你的服务员你得到的是这个响应而不是 JSON
  • api 的响应是什么?可能是您获得对象数组而不是标准字典。就像@InderKumarRathore 指出的那样,使用字符串就可以了。

标签: ios iphone swift web-services alamofire


【解决方案1】:

给你

Alamofire.request(kAppAccessTokenURL).responseString

那里

 Alamofire.request(url).responseJSON

看那个

     let jsonText = "{\"first_name\":\"Sergey\"}"
        var dictonary:NSDictionary?

        if let data = jsonText.dataUsingEncoding(NSUTF8StringEncoding) {

            do {
                dictonary =  try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:AnyObject]

                if let myDictionary = dictonary
                {
                     print(" First name is: \(myDictionary["first_name"]!)")
                }
            } catch let error as NSError {
                print(error)
            }
        }

【讨论】:

  • 我只传递了网址@Uma Madhavi
  • @umaMadhavi 如果它的 json 数据我们该怎么办?
  • 我需要在运行时签入吗?
  • @Uma Madhavi 你能看看这个*.com/questions/47919964/…
  • 将网络管理器中的 responseJSON 替换为 responseString,因为它可以正常工作,然后将其转换为字典并解析它
最近更新 更多