Alamofire Mailchimp API 3.0 subscribe

231 views Asked by At

I am trying to subscribe new user to Mailchimp list using Alamofire. Problem starts when I'm trying to subscribe new user with .post method and JSONObject as a parameter:

func subscribeMail(){

let credentialData = "<my_api_key>".data(using: String.Encoding.utf8)!
let base64Credentials = credentialData.base64EncodedString(options: [])
let headers = ["Authorization": "Basic \(base64Credentials)"]

let url = "https://us11.api.mailchimp.com/3.0/lists/<my_list_id>/members/"

let jsonObj: [String: AnyObject] = [
    "mail_address" : "[email protected]" as AnyObject,
    "status" : "subscribed" as AnyObject,
]

let valid = JSONSerialization.isValidJSONObject(jsonObj)
print(valid)

Alamofire.request(url, method: .post, parameters: jsonObj , encoding: URLEncoding.default , headers: headers).responseJSON{response in
    if response.result.isFailure {
       print("Failed") 
    }
    else if (response.result.value as? [String: AnyObject]) != nil {
        print(response)
        }
    }

}

I get back status code 400:

SUCCESS: {
detail = "We encountered an unspecified JSON parsing error.";
instance = "";
status = 400;
title = "JSON Parse Error";
type = "http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/";
}

In Mailchimp documentation:

JSONParseError

We encountered an unspecified JSON parsing error. This error means that your JSON was formatted incorrectly or was considered invalid or incomplete.

As you can see I am checking my jsonObj if its valid. So I dont get this parsing error..

In Mailchimp API 3.0 its written that just email_address and status fields are needed to subscribe new mail.

If I try to to send request with Alamofire using .get method with some mail address that is already subscribed, everything works fine, I can receive all data from Mailchimp.

Is there really problem with my jsonObj or is it somewhere else?

2

There are 2 answers

2
Mûhámmàd Yäsår K On

Change the object key from 'mail_address' to 'email_address' and give a try.

let jsonObj: [String: AnyObject] = [
    "email_address" : "[email protected]" as AnyObject,
    "status" : "subscribed" as AnyObject,
]
0
Derek Soike On

Since you're getting a JSONParseError, your issue is related to the format in which you're sending the parameters.

Try encoding: JSONEncoding.default instead of encoding: URLEncoding.default.