Поддержка Javascript + MailChimp API

При выполнении этого запроса:

// Subscribe a new account holder to a MailChimp list
function subscribeSomeoneToMailChimpList()
{
  var options =
  {
    "apikey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "id": "xxxxxx",
    "email":
    {
      "email": "[email protected]"
    },
    "send_welcome": false
  };
  var mcSubscribeRequest = UrlFetchApp.fetch("https://us4.api.mailchimp.com/2.0/lists/subscribe.json", options);
  var mcListObject = Utilities.jsonParse(mcSubscribeRequest.getContentText());
}

Этот ответ возвращается:

Ошибка запроса https://us4.api.mailchimp.com/2.0/lists/subscribe.json вернул код 500. Усеченный ответ сервера: { "status": "error", "code": - 100, "name": "ValidationError", "error": "Вы должны указать значение apikey" } (используйте параметр muteHttpExceptions для проверки полного ответа) (строка 120, файл "v2" )

Строка 120 - это линия, на которой вызывается UrlFetchApp.fetch.

Ключ API действителен (я тестировал более простые вызовы API, которые не включают ассоциативные массивы). Когда я добавляю ключ API непосредственно к базовому URL-адресу и удаляю его из options, я получаю сообщение об ошибке, указывающее, что идентификатор списка недействителен. Когда я затем добавляю идентификатор списка непосредственно к базовому URL-адресу и удаляю его из options, я получаю сообщение об ошибке, указывающее, что адрес электронной почты должен быть в форме ассоциативного массива.

Мой вопрос: используя вышеприведенный формат, как отправлять запросы, содержащие ассоциативные массивы?

Соответствующую документацию API можно найти здесь.

Ответ 1

После дальнейших исследований и мастеринга я смог решить это:

https://<dc>.api.mailchimp.com/2.0/lists/subscribe.json?apikey=<my_api_key>&id=<my_list_id>&email[email][email protected]&merge_vars[FNAME]=John&merge_vars[LNAME]=Doe&double_optin=false&send_welcome=false

Где <dc> следует заменить частью после тире в вашем ключе API. например "us1", "us2", "uk1" и т.д.

Ответ 2

Выполнение этого в javascript предоставляет ключ API для всего мира. Если у кого-то есть ваш ключ, он может внести изменения или получить доступ к вашей учетной записи.

Ответ 3

Я думаю, что я понял, что происходит после прочтения документов UrlFetchApp.fetch. https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?csw=1#fetch(String)

Похоже, вы должны использовать некоторые дополнительные параметры для выполнения запроса, такого как полезная нагрузка и метод. Ваша переменная options должна выглядеть так.

  var payload =   {
    "apikey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "id": "xxxxxx",
    "email": {
      "email": "[email protected]"
    },
    "send_welcome": false
  };
  payload = Utilities.jsonStringify(payload); // the payload needs to be sent as a string, so we need this
  var options = {
     method: "post",
     contentType: "application/json", // contentType property was mistyped as ContentType - case matters
     payload: payload
  }; 
  var result = UrlFetchApp.fetch("https://<dc>.api.mailchimp.com/2.0/lists/subscribe.json", options);

Где <dc> следует заменить частью после тире в вашем ключе API. например "us1", "us2", "uk1" и т.д.

Проблема заключается в том, что ваша переменная options предполагается использовать как JSON, а не как параметр URL-адреса GET. Также mailchimp указывает, что лучше использовать POST вместо GET. Таким образом, над всем, вы должны убедиться, что ваш метод "отправил" и убедитесь, что ваша полезная нагрузка действительна JSON.