【问题标题】:Alamofire.request vs. manager.request - manager not workingAlamofire.request 与 manager.request - 经理不工作
【发布时间】:2015-07-29 03:55:38
【问题描述】:

编辑:问题不是关于 -999 的含义,而是为什么我没有在第一个代码片段中出现错误,而是在第二个代码片段中出现错误? 除了在第二个代码 sn-p 中使用 Alamofire.Manager(应该与第一个代码 sn-p 中的 Alamofire.request 相同),一切都是相同的。 这是一个错误,还是我错过了什么?

我有一个可以与 Alamofire.request 一起使用的函数...

func getMenuFromIsoShortDate(menuDate: String) {
    let user = Constants.DummyCredentials.UserName
    let password = Constants.DummyCredentials.PassWord

    var urlString = ""
    let dateForWebservice: NSDate? = NSDate.dateFromIsoString(menuDate)

    if let dateForWebservice = dateForWebservice {
        urlString = Constants.WebservicePath.DailyMenu + NSDate.dateToIsoSlash(dateForWebservice)
        println("urlString: \(urlString)")
    }
    let credential = NSURLCredential(user: user, password: password, persistence: .ForSession)

    Alamofire.request(.GET, urlString)
    .authenticate(usingCredential: credential)
    .response {
        (request, response, data, error) in

        if let response = response {
            var statusCode = response.statusCode
            println("-->statusCode: \(statusCode)")
        }

        if (error == nil) {
            var serializationError: NSError?
            let jsonData: AnyObject? = NSJSONSerialization.JSONObjectWithData(data! as! NSData, options: NSJSONReadingOptions.AllowFragments, error: &serializationError)

            var parser: Parser = Parser()
            let menu: Menu = parser.parseMenuJSON(jsonData)

            var dataAccess: DataAccess = DataAccess.sharedInstance
            dataAccess.addMenu(menu)
        } else {
            println("Webservice error: \(error)")
        }
    }
}

但是当我使用 manager.request 运行代码时 - 它运行,但给了我 -999 错误。这里是修改后的代码:

func getMenuFromIsoShortDate(menuDate: String) {
    let user = Constants.DummyCredentials.UserName
    let password = Constants.DummyCredentials.PassWord

    var urlString = ""
    let dateForWebservice: NSDate? = NSDate.dateFromIsoString(menuDate)

    if let dateForWebservice = dateForWebservice {
        urlString = Constants.WebservicePath.DailyMenu + NSDate.dateToIsoSlash(dateForWebservice)
        println("urlString: \(urlString)")
    }
    let credential = NSURLCredential(user: user, password: password, persistence: .ForSession)

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    manager = Alamofire.Manager(configuration: configuration)

    manager.request(.GET, urlString)
    .authenticate(usingCredential: credential)
    .response {
        (request, response, data, error) in

        if let response = response {
            var statusCode = response.statusCode
            println("-->statusCode: \(statusCode)")
        }

        if (error == nil) {
            var serializationError: NSError?
            let jsonData: AnyObject? = NSJSONSerialization.JSONObjectWithData(data! as! NSData, options: NSJSONReadingOptions.AllowFragments, error: &serializationError)

            var parser: Parser = Parser()
            let menu: Menu = parser.parseMenuJSON(jsonData)

            var dataAccess: DataAccess = DataAccess.sharedInstance
            dataAccess.addMenu(menu)
        } else {
            println("Webservice error: \(error)")
        }
    }
}

这里是错误信息:

Webservice error: Optional(Error Domain=NSURLErrorDomain Code=-999 "Abgebrochen" UserInfo=0x7f8f11c3f210 {NSErrorFailingURLKey=http://test.myserver.de:18507/app/services/mampf/get-menu/2015/05/08, NSLocalizedDescription=Abgebrochen, NSErrorFailingURLStringKey=http://test.myserver.de:18507/app/services/mampf/get-menu/2015/05/08})

这是怎么回事?

【问题讨论】:

  • 错误-999表示请求被取消。当您未能通过身份验证质询时,可能会发生这种情况。
  • @mattt 当然可以,但是为什么使用管理器实例会发生这种情况,而不是使用 Alamofire.request?其余代码完全相同

标签: ios swift alamofire


【解决方案1】:

我可以看到两个可能的问题。

问题 1 - 经理被释放

第一个明显的问题是您是否将自定义 manager 实例保存在内存中。您需要保留属性中的管理器,以确保它不会在请求中间被释放。

问题 2 - 缺少默认 HTTP 标头

Alamofire.request 和您的 manager.request 之间的唯一区别是您的 manager 缺少 Alamofire 共享管理器默认附加的默认标头。

public static let sharedInstance: Manager = {
    let configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders

    return Manager(configuration: configuration)
}()

我会将以下行添加到您的管理器初始化中,看看这是否使行为一致。

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
manager = Alamofire.Manager(configuration: configuration)

希望这可以帮助您了解问题的根源。我不清楚为什么缺少默认标头会导致您看到的问题,但是如果无法访问您的项目,就很难进一步挖掘。

【讨论】:

  • 太棒了 - 非常感谢!这是“问题1”。我有点自欺欺人
【解决方案2】:

试试这个

let url:String = "https://domain.com"
var manager : Manager?

override func viewDidLoad() {
    super.viewDidLoad()

    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "domain.com": .PinCertificates(
            certificates: ServerTrustPolicy.certificatesInBundle(),
            validateCertificateChain: true,
            validateHost: true
        )
    ]


    manager = Manager(
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
    manager!.request(.GET, url)
        .validate()
        .responseJSON { response in
            if let httpError = response.result.error {
                print(httpError.code)

            }

            else {

                print(response.result.value)
            }

    }


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多