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 错误的主要内容,如果未能解决你的问题,请参考以下文章