【问题标题】:headers undefined responseJSON Alamofire 2.0 and Swift 2.0标头未定义 responseJSON Alamofire 2.0 和 Swift 2.0
【发布时间】:2015-10-08 21:54:38
【问题描述】:

使用 swift 2.0 Xcode 7 和 Alamofire 2.0,我想知道如何使用正确的 HTTPAdditionalHeaders 用法更新代码,在更新到 2.0 之前,此管理器会话配置运行良好,但现在 API 给了我一个错误由于未定义的标头而请求。 ¿ 我该如何解决? ¿是否可以在 ApiClient 中维护 alamoFireManager 会话配置 HTTPAdditionalHeaders?

ApiClient.swift

class ApiClient {

 // User token
  var oAuthToken = "R0Fh65G4MjCcD18OsiTcPIfHxohFIzFhapuWNFSBhX2conQ1e+3vlv0XrJQVcw7fRg=="

  var mainService:      MainService

  init() {

    let alamoFireManager = Manager.sharedInstance

    alamoFireManager.session.configuration.HTTPAdditionalHeaders = [
      "Authorization": "Bearer \(oAuthToken)"
    ]

   // override the default challenge behavior in Alamofire using the SessionDelegate override closures.
   //an example of how you can allow Alamofire to accept invalid certificates:

    alamoFireManager.delegate.sessionDidReceiveChallenge = { session, challenge in
      var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling
      var credential: NSURLCredential?

      if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
        disposition = NSURLSessionAuthChallengeDisposition.UseCredential
        credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)
      } else {
        if challenge.previousFailureCount > 0 {
          disposition = .CancelAuthenticationChallenge
        } else {
          credential = alamoFireManager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)

          if credential != nil {
            disposition = .UseCredential
          }
        }
      }

      return (disposition, credential)
    }

    mainService      = MainService()
  }

}

MainService.swift

struct MainService {

  enum Router: URLRequestConvertible {

    static let baseURLString = "https://api.test.com/v1"

    case GetList([String: AnyObject])
    case GetById(String)

    var method: Alamofire.Method {
      switch self {
      case .GetList:
        return .GET
      case .GetById:
        return .GET
      case .Add:
        return .POST
      case .Update:
        return .PUT
      case .Delete:
        return .DELETE
      }
    }

    var path: String {
      switch self {
      case .GetList:
        return "/flyers"
      case .GetById(let id):
        return "/flyers/\(id)"
      case .Add:
        return "/flyers"
      case .Update(let id, _):
        return "/flyers/\(id)"
      case .Delete(let id):
        return "/flyers/\(id)"
      }
    }

    var URLRequest: NSMutableURLRequest {
      let URL = NSURL(string: Router.baseURLString)!
      let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
      mutableURLRequest.HTTPMethod = method.rawValue

      switch self {
      case .GetList(let parameters):
        return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
      case .Add(let parameters):
        return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
      case .Update(_, let parameters):
        return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
      default:
        return mutableURLRequest
      }
    }
  }

  func getList(completionHandler: ([Flyer]?, NSError?) -> ()) {

    Alamofire.request(Router.GetList(["skip": Test().getSkip(), "total":Test().getTotal()])).responseJSON { (request, response, result) in

      switch result {
      case .Success(let data):
        let json = JSON("Request success---------------------\(data)")
        print(json)
      case .Failure(_, let error):
        print("Request failed with error: \(error)")
      }

    }
  }

}

结果

Request success---------------------{
    code = "BAD_REQUEST";
    message = "Bad request";
    status = 400;
}

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    您必须将 Authorization 标头附加到实际的 URL 请求中。 Apple 从未支持您尝试修改 sharedInstance 配置标头的方式。在 iOS 9 中,他们最终将行为与文档内联。在将配置应用于 URL 会话后,它们会完全忽略配置上设置的标头。因此,您要么需要创建自己的自定义 URL 会话配置并在创建 URL 会话之前设置自定义标头,要么在 Authorization 标头的情况下,您需要将其直接附加到请求本身。

    在您的路由器中,您应该在获取列表之前将Authorization 标头附加到您的mutableURLRequest。这将解决您的问题。您必须弄清楚如何重构您的逻辑以使oAuthToken 可以访问Router。我会考虑将其设为static var oAuthToken,以便您可以使用APIClient.oAuthToken 轻松访问该值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      相关资源
      最近更新 更多