Google Apps 脚本中的 POST 请求和 405 错误

Posted

技术标签:

【中文标题】Google Apps 脚本中的 POST 请求和 405 错误【英文标题】:POST request and 405 error in Google Apps Script 【发布时间】:2019-05-08 06:38:12 【问题描述】:

我在 GAS 中遇到了一些问题。我使用需要 Cookie 来进行 POST 请求的 API。什么时候,我用 Postman 尝试它可以工作,但使用脚本我仍然收到 405 错误:/

首先,我发出一个登录请求,它返回一个类似这样的 cookie:JSESSIONID=D55B09A9076826AB6FC35B79B803C3F4; Path=/lambdapath; Secure; HttpOnly,authash=29cb2e5466f8a923da588fa55914fd72

然后,我构建一个这样的 POST 请求:

function createObject(body, cookie) 
  var options = 
    'method': 'post',
    'contentType': 'application/json',
    'Cookie': cookie,
    'payload' : JSON.stringify(body)
  
  var header =  'headers': options 
  try 
   var response = UrlFetchApp.fetch("https://urlOftheAPI/create", header); 
    Logger.log('Saved one item :' + response.getResponseCode())
    return response.getResponseCode();
   catch(err) 
    throw new Error(err); 
  

当我记录标题时,它会返回:

"headers": 
    "method": "post",
    "contentType": "application/json",
    "Cookie": "JSESSIONID=D55B09A9076826AB6FC35B79B803C3F4; Path=/lambdapath; Secure; HttpOnly,authash=29cb2e5466f8a923da588fa55914fd72",
    "payload": "\"foo\":\"bar\""
  
 

感谢您的帮助:)

编辑

感谢@DimuDesign。它在以这种格式传递选项时起作用:

 var options = 
    'method': 'post',
    'contentType': 'application/json',
    'headers': 
      'cookie': 'JSESSIONID=D55B09A9076826AB6FC35B79B803C3F4; Path=/lambdapath; Secure; HttpOnly,authash=29cb2e5466f8a923da588fa55914fd72'
    ,
    'payload' : JSON.stringify(body)
  

【问题讨论】:

【参考方案1】:

您对UrlFetchApp.fetch 的调用格式不正确。检查以下参考文档以了解正确的语法:

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object)

提示headers 对象是options 对象的高级参数。

【讨论】:

我更新了我的问题。我写的时候犯了一个错误:/代码在我的脚本中写得很好,但它不起作用 @PierreJones 它仍然是错误的(请参阅我添加到答案中的提示)。检查我的答案中链接的文档,它将帮助您解决语法问题。 它有效 :) 你是对的。使用这种结构:var options = 'method': 'post', 'contentType': 'application/json', 'headers': 'cookie': cookie , 'payload' : JSON.stringify(body) @PierreJones Viola! :) 在做任何其他事情之前始终参考规范文档...从长远来看可以为您节省大量时间。【参考方案2】:

我使用这段代码来获取 url:

var url = 'https://api.example.com/';
var response = UrlFetchApp.fetch(url);
var data = JSON.parse(response.getContentText());
var result = data.headers.Cookie;
return result;

【讨论】:

问题不在于如何拦截 cookie,而在于如何使用 contenType 在标头中传递它......另外,我已经尝试过你的代码来拦截它,但它不起作用。当我登录到 API 时,它不会返回正文,所以 JSON.parse(response.getContentText()); failed ;)

以上是关于Google Apps 脚本中的 POST 请求和 405 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google Apps 脚本的 Facebook API 批处理请求

如何在对 Google Apps 脚本的发布请求中捕获上传的文件?

链接到 Google Apps 脚本中的另一个 HTML 页面

带有 GraphQL 解析错误的 Google Apps 脚本 API 请求

如何使用普通的POST请求将文件发送到apps脚本?

如何在 Google Apps 脚本中使用 UrlFetchApp 发出 Drive API 批处理请求