为啥请求 Alamofire 失败?

Posted

技术标签:

【中文标题】为啥请求 Alamofire 失败?【英文标题】:Why fail in request with Alamofire?为什么请求 Alamofire 失败? 【发布时间】:2019-12-17 15:57:08 【问题描述】:

我想获取github/users的数据,然后我尝试了两种方法:

第一种方法成功:

AF.request("https://api.github.com/users").responseJSON  response in
    print("UOUOUOUOUOU", response.description)

但是第二次失败了,为什么?

Network.request(Request.users).responseDecodable  (response: AFDataResponse<UserList>) in
      switch response.result 
      case .success(let value):
        print("SUCCESS")
      case .failure(let error):
            print("FAIL")
      
    

我需要使用第二种方法。

这是我的班级网络

class Network 
  let session: Session
  let evaluators = ["api.github.com/users": PinnedCertificatesTrustEvaluator(certificates: [
        Certificates.github
        ])
  ]

  private init() 
    session = Session(serverTrustManager: ServerTrustManager(evaluators: evaluators)
    )
  

  private static let shared = Network()
  static func request(_ convertible: URLRequestConvertible) -> DataRequest 
    return shared.session.request(convertible)
  

我得到这个错误:

FAIL serverTrustEvaluationFailed(reason: Alamofire.AFError.ServerTrustFailureReason.noRequiredEvaluator(host: "api.github.com"))
2019-12-17 12:03:21.649222-0400 SSLOwner[5533:83111] Task <57DC5433-F132-4453-BB68-CCF90B5F6058>.<1> HTTP load failed, 0/0 bytes (error code: -999 [1:89])

编辑 1:这是我的 Struct UserList 和 User

import Foundation
struct UserList: Codable 
  let users: [User]

  enum CodingKeys: String, CodingKey 
    case users = "items"
  



struct User: Codable 
  let displayName: String


session = Session()

我得到这个错误:

responseSerializationFailed(原因: Alamofire.AFError.ResponseSerializationFailureReason.decodingFailed(错误: Swift.DecodingError.typeMismatch(Swift.Dictionary, Swift.DecodingError.Context(codingPath: [], debugDescription: “预期解码字典,但找到一个数组 而是。”,基础错误:无))))

【问题讨论】:

而不是print("FAIL") print(error) 是毫无意义的 错误描述是没有找到关联主机的ServerTrustEvaluator。我会省略评估器 @vadian 你能详细回答这个问题吗 我无法写出答案,因为我在猜测。尝试一个没有ServerTrustManager的简单会话 @vadian 我编辑了我的问题,请参阅 【参考方案1】:

您的最后一个错误明确说明了问题所在。 API 调用的响应是一个数组,而不是您假设的字典。将您的预期响应转换为用户列表,然后它应该可以工作:

Network.request(Request.users).responseDecodable  (response: AFDataResponse<[User]>) in
  switch response.result 
  case .success(let value):
    print("SUCCESS")
  case .failure(let error):
        print("FAIL")
  

【讨论】:

【参考方案2】:

根对象是一个数组,没有key为items的对象,所以删除UserList

替换

AFDataResponse<UserList>)

AFDataResponse<[User]>)

而且用户字典中也没有键displayName

替换

struct User: Codable 
  let displayName: String

struct User: Codable 
  let login: String

【讨论】:

以上是关于为啥请求 Alamofire 失败?的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 从多个请求中取消一个请求

AlamoFire 图像内存问题

发送 Alamofire JSON 数组 Swift

Alamofire RequestAdapter - 修改 URL

如何在 Swift 3 中使用 Alamofire 在 POST 请求中将给定的 JSON 作为参数发送?

为啥我无法从 Alamofire 获取请求结果