【问题标题】:iOS - Swift - Bing Image Search API Authentication with AlamofireiOS - Swift - 使用 Alamofire 进行 Bing 图像搜索 API 身份验证
【发布时间】:2015-07-16 08:52:04
【问题描述】:

尝试使用 Bing API 在 Swift 中检索图像,但没有成功。根据我从 stackoverflow 上的其他类似问题以及 Bing API 文档 (https://onedrive.live.com/view.aspx?resid=9C9479871FBFA822!112&app=Word&authkey=!ANNnJQREB0kDC04) 中收集到的信息,您必须将请求发送到 API,并将 Authorization 标头设置为 Bing API 的 base64 编码版本帐户密钥。所以我尝试了以下方法:

let url = NSURL(string: Settings.bingImageApi + "&Query=" + keyword)!
let plainText = bingAPIKey.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let base64 = plainText!.base64EncodedStringWithOptions(nil)

let manager = Alamofire.Manager.sharedInstance
manager.session.configuration.HTTPAdditionalHeaders = [
  "Authorization": "Basic \(base64)"
]

manager
  .request(.POST, url, parameters: nil, encoding: .JSON)
  .responseJSON { (request, response, data, error) -> Void in
    println(response)
}

println(error) 语句产生以下内容:

{ status code: 401, headers {
    "Access-Control-Allow-Credentials" = false;
    "Access-Control-Allow-Headers" = "Content-Type, Authorization, DataServiceVersion, MaxDataServiceVersion";
    "Access-Control-Allow-Methods" = "GET, POST, PUT, DELETE, OPTIONS";
    "Access-Control-Allow-Origin" = "*";
    "Access-Control-Expose-Headers" = "DataServiceVersion, MaxDataServiceVersion";
    "Access-Control-Max-Age" = 604800;
    "Content-Length" = 91;
    Date = "Thu, 16 Jul 2015 00:38:34 GMT";
    Server = "Microsoft-IIS/8.0";
    "Www-Authenticate" = "Basic Realm=\"\"";
    "X-Content-Type-Options" = nosniff;
    "X-Powered-By" = "ASP.NET";
}

授权通常需要用户名和密码,但在这种情况下,只需要密码即可,而用户名可以为空。我将如何只指定密码值?问题出在我认为的 base64 编码有问题或有问题。

【问题讨论】:

    标签: ios swift alamofire bing-api


    【解决方案1】:

    知道了。需要对整个 username:password 字符串进行编码,而不仅仅是一个值或另一个值。在我修复了我收到 400 错误(错误请求)之后,但我通过在查询字符串周围添加单引号来解决它。最终代码如下:

    let keyword = "'\(currentSearchTerm)'".stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!
    let url = NSURL(string: Settings.bingImageApi + "&Query=" + keyword)!
    
    let credentials = ":\(Settings.bingApiKey)"
    let plainText = credentials.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    let base64 = plainText!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
    
    let manager = Alamofire.Manager.sharedInstance
    manager.session.configuration.HTTPAdditionalHeaders = [
      "Authorization": "Basic \(base64)"
    ]
    
    manager
      .request(.POST, url, parameters: nil, encoding: .JSON)
      .responseJSON { (request, response, data, error) -> Void in
        println(data)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 2012-08-02
      相关资源
      最近更新 更多