【问题标题】:Request failed returned code 400. Truncated server response - Google scripts请求失败返回代码 400。截断的服务器响应 - Google 脚本
【发布时间】:2022-02-15 18:36:53
【问题描述】:

我对 API 很陌生。我已经在 postman 中成功构建了一个 API 并获得了我想要的数据。我生成了 postman 提供的 JavaScript 格式的代码示例:

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
myHeaders.append("Authorization", "Basic ZGVhbGdwwitpflgnBvcnQ6ZldZUmZvVEU5a2hNaFZtUlBlcU1VZ3J5eFRhWXBwN0U3d1hdllBZw==");

var urlencoded = new URLSearchParams();
urlencoded.append("grant_type", "password");
urlencoded.append("username", "123456789");
urlencoded.append("password", "password123!");

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: urlencoded,
  redirect: 'follow'
};

fetch("https://accounts.kernel.com/oidc/token", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

但是,我想使用函数 UrlFetchApp 在 google 脚本 中构建此 API。到目前为止,我正在这样做:

function webRelay(){
  var url = 'https://accounts.autoscout24.com/oidc/token';
  
  var username = "123456789";
  var password = "password123!";

  var headers =
  {
    "Content-Type" :  "application/x-www-form-urlencoded" ,
    "Authorization" : "Basic ZGVhbGdwwitpflgnBvcnQ6ZldZUmZvVEU5a2hNaFZtUlBlcU1VZ3J5eFRhWXBwN0U3d1hdllBZw=="
  }

  var options =
  { 
    "grant_type" : "password",
    "timeout": 0,
    "method" : "post",
    "headers": headers
  };

  // Getting "bad request" here - check the username & password
  var result = UrlFetchApp.fetch(url, options);
  var state=result.getContentText(); 

  
  
}

但我收到以下错误:

https://accounts.kernel.com 的请求失败,返回代码 400。 截断的服务器响应:{"error":"invalid_request"}(使用 用于检查完整响应的 muteHttpExceptions 选项)(第 22 行,文件 "api")

【问题讨论】:

  • 阅读文档中的文档和示例。你需要使用payload(类似于纯js中的body

标签: javascript api google-apps-script postman


【解决方案1】:
  • 您想将问题中的 Javascript 转换为 Google Apps 脚本。
  • 您已经确认您的 Javascript 工作正常。

我可以像上面那样理解。为此,下面的修改如何?

修改点:

  • 在 UrlFetchApp.fetch(url, options), there are no properties ofgrant_typeandtimeout 的 options 中。
  • 看到您的 Javascript 时,数据将作为表单数据发送。
  • UrlFetchApp 的默认“Content-Type”是application/x-www-form-urlencoded
  • 在您的脚本中,username 未使用。

当以上几点反映到脚本中时,变成如下。

修改后的脚本:

在使用修改后的脚本之前,请先设置usernamepasswordheaders的变量。

function webRelay(){
  var url = 'https://accounts.autoscout24.com/oidc/token';
  var username = "123456789";
  var password = "password123!";
  var payload = {
    "grant_type": "password",
    "password": password, 
    "username": username
  }
  var headers = {"Authorization" : "Basic ###"};
  var options = { 
    "method" : "post",
    "headers": headers,
    "payload": payload,
  };
  var result = UrlFetchApp.fetch(url, options);
  var state = result.getContentText();
  Logger.log(state)
}
  • 在此修改后的脚本中,您的令牌已使用### 删除。使用时请自行修改。

参考:

虽然我认为上面修改脚本的请求ob和你的Javascript是一样的。但不幸的是,我无法测试上面的脚本。我为此道歉。因此,如果这对您的情况不起作用,我深表歉意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多