【问题标题】:Not able to read nested properties from doPost(e)无法从 doPost(e) 读取嵌套属性
【发布时间】:2014-01-10 19:18:05
【问题描述】:

我正在尝试使用 Apps 脚本中的 Contentservice 和 doPost(e) 函数创建一个网络服务,以与 Google Apps AdminDirectory 服务进行交互

这是我的代码的概述。我将其保存为我的服务器并将其发布为 websapp

function doPost(e) {
  var data = e.parameter;  
  var resourceType = data.resourceType;
  var method = data.method;
  var resource = data.resource;

  var resourceParams = resource.parameters;

//other code to work with AdminDIrectory
// return ContentService.createTextOutput(myoutputdata).setMimeType(ContentService.MimeType.JSON);
}

在我使用 Apps 脚本编写的用于测试网络服务的客户端代码中

function test() {
  var jsonData = {
    authKey : 'HwZMVe3ZCGuPOhTSmdcfOqsl12345678',
    resourceType : 'user',
    method : 'get',
    resource : {
      parameters : {
        userKey : 'waqar.ahmad@mydomain.com'
      }
    }
  }

  var url = 'https://script.google.com/macros/s/xyzabc12345678_wE3CQV06APje6497dyI7Hh-mQMUFM0pYDrk/exec';

  var params = {
    method : 'POST',
    payload : jsonData
  }

  var resp = UrlFetchApp.fetch(url, params).getContentText();

  Logger.log(resp);
}

现在,当我尝试在服务器端读取 e.parameter.resource.parameters 时,它会给出错误并显示 e.parameter.resource 是字符串类型。 如何在服务器端读取嵌套对象?看来,它只识别一级参数。

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:

    使用

    function doPost(e) {
      return ContentService.createTextOutput(JSON.stringify(e.parameter)).setMimeType(ContentService.MimeType.JSON); 
    

    您会收到回复
    "{"authKey":"HwZMVe3ZCGuPOhTSmdcfOqsl12345678","resource":"{parameters={userKey=waqar.ahmad@mydomain.com}}","method":"get","resourceType":"user"}"

    所以看起来它正在将任何嵌套扁平化为字符串。在comments of a similar problem 中注意到documentation for UrlFetchApp 允许有效负载是“它可以是字符串、字节数组或JavaScript 键/值映射”,但我认为这不会扩展到嵌套键/价值图。

    如另一个答案中所述,解决方案是对有效负载进行字符串化,例如

    var params = {
          method : 'POST',
          payload : {'data':JSON.stringify(jsonData)}
        };
    

    我在处理负载时遇到了问题,这就是我使用键值的原因

    在服务器端脚本你可以处理

    function doPost(e) {
      var data = JSON.parse(e.parameter.data);
      var userKey = data.resource.parameters.userKey;
      ...
    }
    

    【讨论】:

    • 谢谢,太好了。我终于实施了同样的方法。我认为,Google Apps 脚本团队需要看看这个。
    • 非常感谢!我为此苦苦挣扎了好几个小时。除此之外,很遗憾 Google App Script 不能与 Google 的 AngularJs $http Post 请求一起正常工作。我不得不在 GAS 上使用变通方法并更改 $httpProvider 的工作方式,以便能够使它们进行通信。
    【解决方案2】:

    也许它以 JSON 字符串的形式出现?如果是这种情况,您必须在后端解析它,例如:

    resourceObj = JSON_PARSE_METHOD(e.parameter.resource);
    

    例如在 PHP 中是这样的

    $resourceObj = json_decode(e->parameter->resource);
    

    您可以通过在后端打印它的值(或调试它)来确定它是否是 JSON 字符串。

    希望这会有所帮助。干杯

    【讨论】:

    • 当我记录 e.parameter.resource 时,我得到了“{parameters={userKey=waqar.ahmad@mydomain.com}}”。我无法使用 JSON.parse(myJSONString) 解析这个字符串,它说“SyntaxError: Unexpected token in object literal”
    • 你的后端使用什么语言?
    • 我正在使用使用服务器端 Javascript 的 Google Apps 脚本。developers.google.com/apps-script
    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 2020-08-08
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多