如何将PHP中的cURL POST请求转换为Google Apps脚本

wi3ka0sx  于 2022-11-13  发布在  PHP
关注(0)|答案(1)|浏览(210)

VoIP.ms 提供了从其API发送SMS文本消息的功能。它们提供了以下示例代码:

<?
$postfields = array(
    'api_username'=>'john@domain.com',
    'api_password'=>'password',
    'method'=>'getServersInfo',
    'server_pop'=>'1'
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_URL, "https://voip.ms/api/v1/rest.php");
$result = curl_exec($ch);
curl_close($ch);

$data=json_decode($result,true);

echo "<pre>";
print_r($data);
echo "</pre>";
?>

当我在终端的命令行中执行以下命令时,我能够成功地从www.example.com发送SMS文本消息VoIP.ms:

curl -X POST -F 'api_username=john@domain.com' -F 'api_password=password' -F 'method=sendSMS' -F 'did=1234567890' -F 'dst=0987654321' -F 'message=Hello' https://voip.ms/api/v1/rest.php

通过在Google上搜索,我拼凑了以下Google Apps脚本:

function sendSMS() {
  var formData = {
    api_username : "john@domain.com",
    api_password : "password",
    method : "sendSMS",
    did : 1234567890,
    dst : 0987654321,
    message : "Hello"
};
  var options = {
    method : "POST",
    payload : formData
};
  UrlFetchApp.fetch("https://voip.ms/api/v1/rest.php", options);
}

当我运行脚本时,我得到以下错误:
异常错误:对https://voip.ms的请求失败,返回代码500。截断的服务器响应:(<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">使用muteHttpExceptions选项来检查完整的响应)Code.gs:14
有什么建议吗?

laximzn5

laximzn51#

我相信你的目标如下。

  • 您想将下面的curl命令转换为Google Apps脚本。并且,您的curl命令工作正常。
curl -X POST -F 'api_username=john@domain.com' -F 'api_password=password' -F 'method=sendSMS' -F 'did=1234567890' -F 'dst=0987654321' -F 'message=Hello' https://voip.ms/api/v1/rest.php

修改点:

  • 从你的curl命令示例中可以看出,did : 1234567890dst : 0987654321应该是did : "1234567890"dst : "0987654321"
  • 在curl命令中,使用了-F。在本例中,请求头的内容类型是multipart/form-data。不幸的是,UrlFetchApp使用application/x-www-form-urlencoded作为默认内容类型。

当这些要点反映在Google Apps脚本中时,下面的修改如何?

修改的脚本:

function sendSMS() {
  var formData = {
    api_username: "john@domain.com",
    api_password: "password",
    method: "sendSMS",
    did: "1234567890",
    dst: "0987654321",
    message: "Hello"
  };
  var options = { payload: Object.entries(formData).reduce((o, [k, v]) => (o[k] = Utilities.newBlob(v), o), {}) };
  UrlFetchApp.fetch("https://voip.ms/api/v1/rest.php", options);
}

注:

  • 这个修改过的脚本假设您的URL https://voip.ms/api/v1/rest.php可以从Google端访问,并且您的formData的值是有效的值。
  • 在UrlFetchApp中,multipart/form-data的请求正文会在内部服务器端自动创建。但是,如果此请求正文无法用于您的API(有时会出现此请求正文无法使用的情况。),请使用FetchApp (Author: me)测试请求。

参考编号:

  • fetch(url,参数)

相关问题