即使使用 Alamofire 包含 API 密钥,也会收到 MailChimp 错误 "Your request did not include an API key."

Receiving MailChimp error "Your request did not include an API key." even though the API key is included using Alamofire

我正在使用 Alamofire 向 MailChimp 发送请求以将用户添加到列表

MailChimp 的文档说:

There are 2 authentication methods for the API: HTTP Basic authentication and OAuth2. The easiest way to authenticate is using HTTP Basic authentication. Enter any string as your username and supply your API Key as the password.

我为 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] {

        }
    }

我检查 API 密钥是否正确,使用它来访问他们的游乐场: https://us1.api.mailchimp.com/playground/

我收到的回复表明 API 密钥未包含在内:

Your request did not include an API key.

我哪里做错了?

所以 MailChimp 实际上需要在授权 header 中发送的 api 密钥,如下所示:

        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 credentialData = "user:<apikey>".dataUsingEncoding(NSUTF8StringEncoding)!
    let base64Credentials = credentialData.base64EncodedStringWithOptions([])

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

    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] {

        }
    }

编辑:请参阅下面 Derek Soike 对 Swift 3

的回答

如果您像 bxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5dxf-us10 那样传递 apikey,那么您将收到您指定的错误。

尝试通过跳过连字符后的字符(如“bxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5dxf”)来传递 apikey,并检查它是否有效。

Swift 3

一定要看看 MailChimp 的 Error Glossary401 表示您的 API 密钥没有被正确读取。


对于Swift3,中的header构造需要更新为这个。否则它完全有效。

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

下面是一个使用 Request.authorizationHeader 的示例。

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)
    }
}

Swift 3 截至 2017 年 9 月 5 日

它说 method 是一个意外的额外参数。您的编码部分可能已关闭。它应该看起来像这样:

编码:JSONEncoding.default