Alamofire 的身份验证不断失败

Posted

技术标签:

【中文标题】Alamofire 的身份验证不断失败【英文标题】:Authentication keeps failing with Alamofire 【发布时间】:2015-09-30 16:21:37 【问题描述】:

我最近将我的项目迁移到 Swift 2.0 并且遇到了很多错误。 我修复了大部分,但这个总是出错。

我正在使用 Alamofire 调用 Bing 搜索 API,如下所示,我收到一条错误消息:“Error Domain=NSCocoaErrorDomain Code=3840 “字符 0 周围的值无效。” UserInfo=NSDebugDescription=字符 0 周围的值无效。”

我了解这意味着身份验证失败。 谁能告诉我如何解决这个问题?

let percentedKeyword = searchKey.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
Let ulrStr: String = "https://api.datamarket.azure.com/Bing/Search/v1/News" + "? Query=" + percentedKeyword! + "&$top=10&$format=JSON"
let credentials = ":\(bingApiKey)"
let plainText = credentials.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let base64 = plainText!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))

let headers = ["Authorization": "Basic \(base64)"]

Alamofire.request(.GET, urlStr, headers: headers)
    .responseJSON  request, response, data in
        switch data 
        case Result.Success(let receivedValue):
            self.bingJson = JSON(receivedValue)
        case Result.Failure(_, let error as NSError):
            print(error)
        default:
            print("do nothing")
        

Xcode 7.0 版 Alamofire 版本 2.0.2

[更新]

我尝试了 urlStr("https://api.datamarket.azure.com/Bing/Search/News?Query=%E4%B8%AD%E5%9B%BD&$top=10&$format=JSON") 网络浏览器。 它要求我输入用户名和密码,所以我输入 apiKey 作为密码,并按照Microsoft doc 的指示将用户名留空

我收到此错误:参数:查询不是字符串类型

根据***,这是因为关键字没有百分号,但是我在关键字字符串中添加了百分号...

【问题讨论】:

你应该改用responseString。 JSON 解析失败。 您在查询字符串中的?Query 关键字之间也有一个空格。 感谢您的建议!事实证明,我需要单引号来搜索关键词。之间的空间?查询似乎是由我的拼写检查插件(Ginger)创建的。 JSON 解析似乎仍在工作。 【参考方案1】:

事实证明,我需要单引号作为搜索关键词。

let percentedKeyword = searchKey.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
        let urlStr: String = "https://api.datamarket.azure.com/Bing/Search/News" + "?Query=" + "'" + percentedKeyword! + "'" + "&$top=10&$format=JSON"
        let credentials = ":\(bingApiKey)"
        let plainText = credentials.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
        let base64 = plainText!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))

        let headers = ["Authorization": "Basic \(base64)"]

        Alamofire.request(.GET, urlStr, headers: headers)
            .responseJSON  request, response, data in
                switch data 
                case Result.Success(let receivedValue):
                    self.bingJson = JSON(receivedValue)
                case Result.Failure(_, let error as NSError):
                    print(error)
                default:
                    print("do nothing")
                
        
    

【讨论】:

以上是关于Alamofire 的身份验证不断失败的主要内容,如果未能解决你的问题,请参考以下文章

具有 Alamofire 下载功能的 JWT 身份验证

如何使用 Alamofire 上传具有身份验证的 MultipartFormData

Alamofire 中的基本身份验证标头

当 Alamofire 请求通过身份验证时,我应该如何注销?

Alamofire 未创建身份验证标头来发送凭据

使用客户端证书与 Alamofire 进行身份验证