Recibiendo el error de MailChimp "Su request no incluía una key de API". Aunque la key de API se incluye con Alamofire

Estoy usando Alamofire para enviar una request a MailChimp para agregar un usuario a una list

Los documentos de MailChimp dicen:

Existen 2 methods de authentication para la API: authentication básica HTTP y OAuth2. La forma más fácil de autenticar está utilizando la authentication básica HTTP. Ingrese cualquier cadena como su nombre de usuario y proporcione su key API como contraseña.

La request que escribí para Alamofire:

let params: [String : AnyObject] = ["email_address": email, "status": "subscribed", "merge_fields": [ "FNAME": name]] guard let url = "https://us10.api.mailchimp.com/3.0/lists/<listID>/members/".stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) else { return } Alamofire.request(.POST, url, parameters: params, encoding: .URL) .authenticate(user: "apiKey", password: "<apikey>") .responseJSON { response in if response.result.isFailure { } else if let responseJSON = response.result.value as? [String: AnyObject] { } } 

Verifiqué que la key API es correcta al usarla para acceder a su área de juegos: https://us1.api.mailchimp.com/playground/

La respuesta que recibo indica que la key API no estaba incluida:

Su request no incluía una key de API.

¿Dónde me he equivocado?

Swift 3

Asegúrese de echar un vistazo al Glosario de errores de MailChimp. Un 401 indica que su key API no se está leyendo correctamente.


Para Swift 3, la construcción del encabezado en la respuesta de Abbey Jackson debe actualizarse a esto. De lo contrario, funciona por completo.

 let cnetworkingentialData = "AnyString:\(apiKey)".data(using: String.Encoding.utf8)! let base64Cnetworkingentials = cnetworkingentialData.base64EncodedString() let headers = ["Authorization": "Basic \(base64Cnetworkingentials)"] 

Aquí hay un ejemplo que usa Request.authorizationHeader lugar.

 let apiKey: String = "xxxxxxxxxxxxxxx2b-us11" // note the 'us11' let baseUrl: String = "https://us11.api.mailchimp.com/3.0" // note the 'us11' let listId: String = "xxxxxx2f" func createListMember() { let url = "\(baseUrl)/lists/\(listId)/members" guard let authorizationHeader = Request.authorizationHeader(user: "AnyString", password: apiKey) else { print("!authorizationHeader") return } let headers: HTTPHeaders = [ authorizationHeader.key: authorizationHeader.value ] let parameters: Parameters = [ "email_address": email, "status": "subscribed" ] // perform request (make sure you're using JSONEncoding.default) Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers) //.authenticate(user: "AnyString", password: apiKey) // this doesn't work .validate() .responseJSON {(response) in print(response) } } 

Entonces, MailChimp necesita la key api enviada en el encabezado de la autorización así:

  let params: [String: AnyObject] = ["email_address": email, "status": "subscribed"] guard let url = "https://us10.api.mailchimp.com/3.0/lists/<listID>/members/".stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) else { return } let cnetworkingentialData = "user:<apikey>".dataUsingEncoding(NSUTF8StringEncoding)! let base64Cnetworkingentials = cnetworkingentialData.base64EncodedStringWithOptions([]) let headers = ["Authorization": "Basic \(base64Cnetworkingentials)"] Alamofire.request(.POST, url, headers: headers, parameters: params, encoding: .URL) .responseJSON { response in if response.result.isFailure { } else if let responseJSON = response.result.value as? [String: AnyObject] { } } 

editar: Vea la respuesta de Derek Soike a continuación para Swift 3

Swift 3 a partir del 5 de septiembre de 2017

Dice que el método es un argumento adicional por crash. Es probable que su parte de encoding esté desactivada. Debe tener un aspecto como este:

encoding: JSONEncoding.default

Si está pasando el apikey como similar a bxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5dxf-us10 , obtendrá el error como lo especificó.

Intenta pasar el apikey omitiendo los caracteres después del guión (como " bxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5dxf ") y verifica si funciona.