簡體   English   中英

標頭未定義響應JSON Alamofire 2.0和Swift 2.0

[英]headers undefined responseJSON Alamofire 2.0 and Swift 2.0

使用swift 2.0 Xcode 7和Alamofire 2.0,我想知道如何使用正確的HTTPAdditionalHeaders用法更新代碼,在更新到2.0之前,此管理器會話配置運行良好,但是由於以下原因,API給了我一個BAD REQUEST:未定義的標頭。 ¿我該如何解決? ¿能否在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;
}

您必須將Authorization標頭附加到實際的URL請求。 Apple從未支持您嘗試修改sharedInstance配置標頭的方式。 在iOS 9中,他們最終將行為與文檔內聯。 在將配置應用於URL會話后,它們將忽略配置中設置的忽略標頭。 因此,您需要創建自己的自定義URL會話配置並在創建URL會話之前設置自定義標頭,或者在出現Authorization標頭的情況下,您需要將其直接附加到請求本身。

在路由器中,應該在獲取列表之前將Authorization標頭附加到mutableURLRequest 這樣可以解決您的問題。 您將必須弄清楚如何重構邏輯以使oAuthToken可被Router訪問。 我會考慮將其static var oAuthToken以便您可以使用APIClient.oAuthToken輕松訪問該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM