请求正文方法PATCH覆盖给出错误“属性缺失”

时间:2019-01-24 21:08:14

标签: google-apps-script

我正在尝试通过其API和Google Apps脚本更新名为3Commas的服务上的交易机器人。我正在尝试根据某些条件不时更新其使用的对(BTC_ETH,BTC_MANA等)。此刻,我迷失了为什么呼叫中未读取有效负载信息的原因。

最初,我尝试了一个失败的查询字符串。通过阅读,我发现请求正文最适合POST / PUT操作。因此,我现在正在尝试使用请求正文。呼叫是通过PATCH。据我所读,您需要使用POST方法和GAS中PATCH的标头替代。我已经将所有强制性参数包括在“ botParams”中。这是3个逗号的文档:3commas

感谢您的帮助。

try {
  var editBots = "/ver1/bots/250549/update";

  var baseUrl = "https://3commas.io";
  var endPoint = "/public/api"+editBots+"?";


  var botParams = {
    "name": "cqstoshi",
    "pairs": ["BTC_MANA","BTC_TRX","BTC_WAN"],
    "base_order_volume": 0.001,
    "take_profit": 1.5,
    "safety_order_volume": 0.001,
    "martingale_volume_coefficient": 2,
    "martingale_step_coefficient": 1,
    "max_safety_orders": 2,
    "active_safety_orders_count": 1,
    "safety_order_step_percentage": 2.5,
    "take_profit_type": "total",
    "strategy_list": [{"strategy":"cqs_telegram"}],
    "bot_id": 250549
    };

  var payload = JSON.stringify(botParams)


  var totalParams = endPoint + payload; 
  Logger.log(totalParams)
  var signature = Utilities.computeHmacSha256Signature(totalParams, secret);
  signature = signature.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");


  //headers
  var headers = {
    'APIKEY': key,
    'Signature': signature,
    "X-HTTP-Method-Override": "PATCH"
    };

   var params = {
    'method': 'POST',
    'headers': headers,
    'payload' : payload,

    muteHttpExceptions: true
  };
  //call
  var data = UrlFetchApp.fetch(baseUrl + endPoint, params).getContentText();
  var json = JSON.parse(data);  
    Logger.log(json)
  } catch (err) {Logger.log(err)}

//This is a logger report and the error I am currently receiving:


//Logger
[19-01-24 15:00:45:304 EST] 
/public/api/ver1/bots/250549/update? 
{"name":"cqstoshi",
"pairs":["BTC_MANA","BTC_TRX","BTC_WAN"],
"base_order_volume":0.001,
"take_profit":1.5,
"safety_order_volume":0.001,
"martingale_volume_coefficient":2,
"martingale_step_coefficient":1,
"max_safety_orders":2,
"active_safety_orders_count":1,
"safety_order_step_percentage":2.5,
"take_profit_type":"total",
"strategy_list":[{"strategy":"cqs_telegram"}],"bot_id":250549}

//Error
[19-01-24 15:00:45:608 EST]
{error_attributes={base_order_volume=[is missing],
safety_order_volume=[is missing], 
martingale_volume_coefficient=[is missing], 
strategy_list=[is missing], 
take_profit=[is missing], 
max_safety_orders=[is missing], 
martingale_step_coefficient=[is missing], 
active_safety_orders_count=[is missing], 
name=[is missing], 
take_profit_type=[is missing, does not have a valid value], 
safety_order_step_percentage=[is missing], 
pairs=[is missing]}, 
error_description=Invalid parameters, 
error=record_invalid}


1 个答案:

答案 0 :(得分:1)

此修改如何?

修改点:

  • 在脚本中,botParams用于查询参数和请求正文。
  • 使用botParams作为查询参数时,需要转换为查询参数。
  • 通过此'method': 'POST',,该请求成为POST方法。

当以上几点反映到您的脚本中时,它如下所示。

修改后的脚本:

在此修改后的脚本中,请求botParams作为查询参数。

var editBots = "/ver1/bots/250549/update";
var baseUrl = "https://3commas.io";
var endPoint = "/public/api"+editBots+"?";
var botParams = {
  "name": "cqstoshi",
  "pairs": ["BTC_MANA","BTC_TRX","BTC_WAN"],
  "base_order_volume": 0.001,
  "take_profit": 1.5,
  "safety_order_volume": 0.001,
  "martingale_volume_coefficient": 2,
  "martingale_step_coefficient": 1,
  "max_safety_orders": 2,
  "active_safety_orders_count": 1,
  "safety_order_step_percentage": 2.5,
  "take_profit_type": "total",
  "strategy_list": [{"strategy":"cqs_telegram"}],
  "bot_id": 250549
};
var keys = Object.keys(botParams); // Added
var totalParams = keys.reduce(function(q, e, i) { // Added
  q += e + "=" + encodeURIComponent(JSON.stringify(botParams[e])) + (i != keys.length - 1 ? "&" : ""); // Modified
  return q;
}, endPoint);
Logger.log(totalParams)
var signature = Utilities.computeHmacSha256Signature(totalParams, secret);
signature = signature.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
var headers = { // Modified
  'APIKEY': key,
  'Signature': signature,
};
var params = { // Modified
  'method': 'PATCH',
  'headers': headers,
  muteHttpExceptions: true
};
var data = UrlFetchApp.fetch(baseUrl + totalParams, params).getContentText(); // Modified
var json = JSON.parse(data);
Logger.log(json)

注意:

  • 此修改后的脚本假定editBotsbotParamskeysecret是正确的值。

我无法测试。因此,如果这样做不起作用,我深表歉意。那时,您可以提供响应值的详细信息吗?

编辑1:

在此修改中,JSON.stringify()仅用于作为对象的pairsstrategy_list。这样,其他值不会被双引号引起来。

发件人:

q += e + "=" + encodeURIComponent(JSON.stringify(botParams[e])) + (i != keys.length - 1 ? "&" : ""); // Modified

收件人:

q += e + "=" + (typeof botParams[e] == "object" ? encodeURIComponent(JSON.stringify(botParams[e])) : encodeURIComponent(botParams[e])) + (i != keys.length - 1 ? "&" : "");

编辑2:

尽管我不确定API的规格,您可以尝试这种修改吗?是pairs=BTC_MANA&pairs=BTC_TRX&pairs=BTC_WAN。对于botParams,请不要从"pairs": ["BTC_MANA","BTC_TRX","BTC_WAN"],进行修改。

要对此进行测试,请按如下所示修改q +=...的行。

q += (e == "pairs" ? botParams[e].reduce(function(s, f, j) {
  s += e + "=" + f + (j != botParams[e].length - 1 ? "&" : "");
  return s;
},"") : e + "=" + (typeof botParams[e] == "object" ? encodeURIComponent(JSON.stringify(botParams[e])) : encodeURIComponent(botParams[e]))) + (i != keys.length - 1 ? "&" : "");