4

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

MailChimp 的文档说:

API 有 2 种身份验证方法:HTTP Basic 身份验证和 OAuth2。最简单的身份验证方法是使用 HTTP 基本身份验证。输入任何字符串作为您的用户名并提供您的 API 密钥作为密码。

我为 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 密钥不包括在内:

您的请求未包含 API 密钥。

我哪里出错了?

4

4 回答 4

6

斯威夫特 3

请务必查看 MailChimp 的错误词汇表401表示您的 API 密钥没有被正确读取。


对于 Swift 3,Abbey Jackson 的答案中的标题结构需要更新为此。否则它完全有效。

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)
    }
}
于 2017-06-10T01:13:18.373 回答
5

所以 MailChimp 实际上需要像这样在授权标头中发送的 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 的回答

于 2016-08-31T06:07:21.640 回答
0

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

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

于 2016-08-31T07:14:04.607 回答
0

Swift 3截至 2017 年 9 月 5 日

它说方法是偶然的额外参数。您的编码部分可能已关闭。它应该如下所示:

编码:JSONEncoding.default

于 2017-09-06T23:15:42.207 回答