http - 网址获取应用程序 : how to simulate a HTTP post that have params with same name multiple times

标签 http google-apps-script http-headers http-post mailgun

在 HTTP 请求中,可以多次指定大多数参数,HTTP 开箱即用地支持这一点。但是在使用 Class UrlFetchApp 时如何做到这一点? Google Apps 脚本?

我正在尝试使用 Mailgun API 发送邮件并希望附加多个附件。这是Mailgun API says about this :

Note that you can specify most parameters multiple times, HTTP supports this out of the box. This makes sense for parameters like cc, to or attachment.

以下是一些与其他语言或平台相关的其他类似问题,但这些都没有帮助:

这是我的代码,适用于单个附件。请注意,函数 mailgun() 采用与 GmailApp.sendEmail() 完全相同的参数。出于一致性目的:

function mailgun(recipient, subject, body, options){

var params = {
  "method":"POST",
  "headers": {
    "Authorization" : "Basic " + Utilities.base64Encode('api:key-goes-here')
  },
  "payload": {
    "to": recipient,
    "subject": subject,
    "text": body,
    "html": options.htmlBody
  },
  "muteHttpExceptions": true,
};

if(options.hasOwnProperty("bcc"))
  params.payload.bcc = options.bcc;

if(options.hasOwnProperty("cc"))
  params.payload.cc = options.cc;

if(options.hasOwnProperty("replyTo"))
  params.payload['h:Reply-To'] = options.replyTo;

if(options.hasOwnProperty("name")){
  params.payload.from = options.name + ' <' + options.from + '>';
} else {
  params.payload.from = options.from;
}

if(options.hasOwnProperty("attachments")){
  params.payload.attachment = options.attachments[0];
}

var response = UrlFetchApp.fetch('https://api.mailgun.net/v3/domain.com/messages', params);
var responseCode = response.getResponseCode();
var responseObj = JSON.parse(response.getContentText());

if(responseCode != 200) return 'Mailgun error: '+responseObj.message;  

return true;

}

如果我使用此代码,邮件会通过但没有附件:

if(options.hasOwnProperty("attachments")){
  params.payload.attachment = [options.attachments[0],
                               options.attachments[1]
                              ];
}

Mailgun API 表示“您可以发布多个附件值”。这有点误导,因为本质上它们的意思是“您可以多次指定附件参数”以发送多个附件。

由于有效载荷是一个对象,因此使用 UrlFetchApp 是不可能的,我想唯一的方法是手动构建多部分有效载荷而不依赖于自动生成的 UrlFetchApp。

这是有效的 Curl 请求。需要使用 urlFetch 来模拟这个:

curl -s --user 'api:key-goes-here' \
https://api.mailgun.net/v3/domain.com/messages \
-F from='Support <support@domain.com>' \
-F to=example@domain.com \
-F subject='Hello' \
-F text='Testing some Mailgun awesomness!' \
-F attachment='@image.png' \
-F attachment='@license.txt' \

最佳答案

我有一个类似的问题,我通过应用以下函数将有效负载对象手动编码为字符串来解决它:

function jsonToUrlencoded(obj) {
  var str = [];
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      if (Array.isArray(obj[key])) {
        for (var i=0;i<obj[key].length;i++) {
          str.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key][i]));
        }
      } else {
        str.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]));
      }
    }
  }
  return str.join("&");
}

我在以下示例中使用了 HTTP 请求的代码:

  var payload={
    user_ID:2,
    action:'editpost',
    originalaction:'editpost',
    post_author:2,
    post_type:'post',
    original_post_status:'auto-draft',
    'post_category[]':[1,4,32]
  };
  options={
    method:'post',
    headers:cookies,
    payload:jsonToUrlencoded(payload),
  };
  var response = UrlFetchApp.fetch(url,options);

关于http - 网址获取应用程序 : how to simulate a HTTP post that have params with same name multiple times,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42015392/

相关文章:

google-apps-script - Google Apps脚本要删除Google云端硬盘中的所有文件?

Node.js 使用 Express 在 HTTP POST 上以 multipart/form-data 形式写入 jpeg 文件

ruby-on-rails - 如何在 ruby​​ 的 http 请求中包含 header

python - 使用 Tornado httpclient 对 Github API 的简单未授权请求返回 Forbidden

python - 如何进行具有多个过滤器的 Django 数据库查询?

http - Node.js : How to do something on all HTTP requests in Express?

performance - Google 电子表格脚本非常慢

sql - 如何在 Google Bigquery 中按小时分组

javascript - 在 XUL 应用程序中监听 HTTP header

javascript - 为图像创建浏览器池直到可用