iOS — Swift — Аутентификация Bing Image Search API с помощью Alamofire

Попытка использовать API Bing для получения изображений в Swift, но безуспешно. Из того, что я собрал из других подобных вопросов в stackoverflow, а также из документации Bing API (https://onedrive.live.com/view.aspx?resid=9C9479871FBFA822!112&app=Word&authkey=!ANNnJQREB0kDC04) заключается в том, что вы должны отправить запрос на API с Авторизацией Заголовок установлен на закодированную base64 версию вашего ключа учетной записи Bing API. Итак, я попробовал следующее:

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, как мне кажется, что-то не так.


person Ryan Bobrowski    schedule 16.07.2015    source источник


Ответы (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)
}
person Ryan Bobrowski    schedule 16.07.2015