【问题标题】:How to access body of post request in app script using doPost(request)如何使用 doPost(request) 访问应用脚本中的 post 请求正文
【发布时间】:2012-10-18 13:54:14
【问题描述】:

我需要访问 Google App Script 中发布请求的原始正文。我看到有类似的东西

function doPost(request) {
  request.contentLength
}

实际上返回请求正文的原始内容的正确长度。所以我认为必须有一些东西来获得完整的身体,例如作为字符串。

我不希望访问可能使用 post 传输的表单字段参数。

【问题讨论】:

    标签: google-apps-script web-applications http-post


    【解决方案1】:

    我知道这个问题已经过时了,但是很多事情都发生了变化,谷歌现在已经提供了这个问题。您可以使用以下命令轻松访问来自 doPost(e) 的 POST 请求的正文:

    e.postData.contents
    

    如果你想解析传入的 JSON,使用这个:

    JSON.parse(e.postData.contents)
    

    【讨论】:

    • 是的,但是 postData 的内容不包含 post 请求的 url。只有参数。
    • @KaranAhuja 你是什么意思?该 URL 将指向您自己发布的脚本。反正你知道的。 URL 的其余部分是参数,您现在可以获取这些参数。有什么问题?
    • 如果有人只是复制我的表单操作或 $.ajax url 并开始将垃圾数据提交到我的 google 脚本电子表格。因此,如果我可以限制 google app 脚本 dopost 功能只允许来自我的 url 而不是任何其他 url 的请求,那么我可以避免垃圾邮件。更多讨论在这里 - github.com/dwyl/… 我的用户名是 karan-ta function doPost(e) { // 如何在这里获取 post 请求的 url ??? }
    • 那么您发布的脚本 URL 就是您的“关键”。当然,如果您共享它或它被盗,任何人都可以访问它。但是,如果您丢失了密码,任何人都可以访问您的帐户。
    【解决方案2】:

    Release Notes of May 9, 2013,使用request.postData.getDataAsString()

    function doPost(request) {
        var jsonString = request.postData.getDataAsString();
        var jsonData = JSON.parse(jsonString);
        sheet.appendRow([ 'Data1:' , jsonData.Data1 ]); // Just an example
    }
    

    【讨论】:

    • 这仅适用于单级 JSON 对象,例如{“测试”:1,“测试2”:2}。在多级 JSON 对象上,它会引发解析错误。例如 {"test1":{"field1":1}}
    【解决方案3】:

    您可以通过从参数创建 Blob 来访问帖子的原始正文。然后,您可以在 Blob 对象上调用各种方法,例如 getBytes() 或 getDataAsString()。函数列在here

    function doPost(event) {
      var contentBlob = event.parameter.thefile;
      var contentAsString = contentBlob.getDataAsString();
      var bytes = contentBlob.getBytes();
      // do something with the contents ...
    }
    

    【讨论】:

    • 感谢指针,但如果我不提供多部分表单主体,event.parameter 似乎为空,不是吗?请注意,我不是在寻找一种方法来访问多部分表单帖子中的字段,而是寻找一种方法来处理完整的原始帖子正文内容。
    • 访问上传的文件与访问请求正文不同,不幸的是我认为目前无法访问 POST 正文。我还为此效果添加了答案:stackoverflow.com/a/13715445/5295
    【解决方案4】:

    我认为目前无法访问 POST 正文,例如实现 REST 服务。我为此提交了enhancement request;如果您偶然发现了这个问题,请随时为它加注星标以对该问题进行投票。

    【讨论】:

      【解决方案5】:

      这也应该有效。

      function doPost(e) {
      
        if(typeof e !== 'undefined')
          Logger.log(e.parameter);
      
      }
      

      【讨论】:

      • 这只是记录参数。问题是访问 Post Request Body - (Headers)
      【解决方案6】:

      找出您有权访问的所有内容的最简单方法是打印出请求对象。

      function doPost(request) {
        Logger.log(request); 
      }
      

      然后对脚本的 URL 进行 POST 以查看日志内容

      【讨论】:

      • 感谢您的提示,但我看到的只是参数和 contentLength:Logger.log([{queryString=null, parameter={}, contextPath=, parameters={}, contentLength= 3}, []])
      【解决方案7】:

      根据您尝试执行的操作的性质以及您对发布请求发起的控制权,您可能能够与 Drive API 集成。如果帖子数据可以作为文件(例如包含原始 JSON 数据)发送到用户的云端硬盘帐户,那么您的脚本就可以找到该文件,加载其内容,对它进行任何您需要的操作(例如,将其放入电子表格中),并且可以选择删除云端硬盘文件。当然,这假设您可以控制发布请求的发送方式。工作流程可能涉及:

      1. 客户端将包含数据的发布请求发送到用户的云端硬盘帐户(标签或名称文件以便以后轻松识别)
      2. 驱动器文件创建完成后,客户端会向您的脚本发送一个带有参数“method=consumeData”等的请求
      3. 您的脚本使用 DocList 服务检查用户的云端硬盘帐户并检索为您的脚本上传的所有文件

      我还没有尝试过,但应该可以!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-23
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        • 2019-02-20
        • 1970-01-01
        • 2015-09-05
        • 1970-01-01
        相关资源
        最近更新 更多