通过 urlfetchapp 放置请求会产生“异常:属性提供无效值:Header:Content-Length”

问题描述

目标是使用 urlfetchapp 和通过 Apps 脚本的放置请求将订单的“OrderStatusID”更新为“1”。

function updateOrderStatus(){

  var private_key = "{private_key}";
  var merchant_token = "{merchant_token}";
  var secure_url = "{secure_url}";
  
  var body = JSON.stringify({"OrderStatusID": "1"});
  var url ="https://apirest.3dcart.com/3dCartWebAPI/v2/Orders/{orderID}";
  
  var options =  {
    "method" : "put","headers" : {
      "Content-Type" : "application/json","Content-Length" : body.length,"Accept" : 'application/json',"SecureURL" : secure_url,"PrivateKey" : private_key,"Token" : merchant_token
    },"body" : body,"muteHttpExceptions" : false,}
  try{
    var response = UrlFetchApp.fetch(url,options);
  }
  catch(err){
    Logger.log(err);
  }
  finally{
    Logger.log(response);
  }
}

代码抛出错误异常:属性提供无效值:Header:Content-Length

更改代码删除敏感信息。

解决方法

将选项“body”的名称更改为“payload”解决了问题。

答案在此google issue tracker thread中找到。

ek...@googlers.comek...@googlers.com #6Apr 11,2016 07:03AM 状态: 无法修复(不可重现)UrlFetchApp 没有高级 名为“contentLength”的参数。内容长度标头是 根据传入的payload长度自动计算。 您在示例中设置的“contentLength”高级参数是 简单地被后端忽略并自动计算长度。

Content-Length 是根据有效负载自动计算的。我认为它应该被命名为 body 因为 3dCart API 文档在示例中使用 body 作为其 json 的名称。

更正的代码:

function updateOrderStatus(){

  var private_key = "{private_key}";
  var merchant_token = "{merchant_token}";
  var secure_url = "{secure_url}";
  
  var body = JSON.stringify({"OrderStatusID": "1"});
  var url ="https://apirest.3dcart.com/3dCartWebAPI/v2/Orders/{orderID}";
  
  var options =  {
    "method" : "put","headers" : {
      "Content-Type" : "application/json",//"Content-Length" : body.length,"Accept" : 'application/json',"SecureURL" : secure_url,"PrivateKey" : private_key,"Token" : merchant_token
    },"payload" : body,"muteHttpExceptions" : false,}
  try{
    var response = UrlFetchApp.fetch(url,options);
  }
  catch(err){
    Logger.log(err);
  }
  finally{
    Logger.log(response);
  }
}