0

尝试了许多选项来使用 Google Apps Script UrlFetchApp.fetch() put 方法更新 ECWID 中的产品,但没有成功。以下是我编写代码和测试的不同方式,但会遇到不同类型的错误。

我想,我错过了一些小东西,无法弄清楚。请帮我解决这个问题。

API:ECWID Products API ( http://kb.ecwid.com/w/page/25285101/Product%20API#RESTAPIMethodupdateaproduct ) 方法:PUT(更新产品详情)


示例代码 1:-

function updateProducts(){
var products_authkey = "xxxxxxxx";

  try{
    var url ="https://app.ecwid.com/api/v1/xxxxx/product?id=xxxxxxxx&secure_auth_key="+products_authkey;
    var payload = {price:62755};

    var options ={method:"put",ContentType:"application/json",payload:payload};    
    var result = UrlFetchApp.fetch(url, options);    
    var response = result.getContentText();
  }catch(e){
    Browser.msgBox(e);
  }
}

错误:- "{ "error": "OTHER", "errorMessage": "解析 JSON 时出错:JSONObject 文本必须在字符 0 处以 '{' 开头" }"


版本 2:- 尝试将对象转换为 json stringify,但同样的错误。

function updateProducts_version2(){
  try{
    var url ="https://app.ecwid.com/api/v1/xxxx/product?id=xxxxx&secure_auth_key="+products_authkey;
    var payload = {price:62755};
    var payload_json = Utilities.jsonStringify(payload);
    var options ={method:"put",ContentType:"application/json",payload:payload_json,muteHttpExceptions:true};
    var result = UrlFetchApp.fetch(url, options);
    var response = result.getContentText();
    var res_code = result.getResponseCode();
    var x = 1;
  }catch(e){
    Browser.msgBox(e);
  }
}

错误:- "{ "error": "OTHER", "errorMessage": "解析 JSON 时出错:JSONObject 文本必须在字符 0 处以 '{' 开头" }"


版本 3:- (尝试在标头中使用 Authorization 传递 secure_auth_key)

function updateProducts_version3(){
  try{
    var url ="https://app.ecwid.com/api/v1/xxxxx/product?id=xxxxx";
    var payload = {price:62755};
    var headers = {Authorization: 'xxxxxxx'};
    var options = {headers:headers,method:"put",ContentType:"application/json",payload:payload};
    var options ={method:"put",ContentType:"application/json",payload:payload,muteHttpExceptions:true};
    var result = UrlFetchApp.fetch(url, options);
    var response = result.getContentText();
    var res_code = result.getResponseCode();
    var x = 1;
  }catch(e){
    Browser.msgBox(e);
  }
}

错误:- { "error": "OTHER", "errorMessage": "API key not found in request parameters" }


另请注意,我尝试使用 DevHttpClient chrome 插件,它正在正确更新。这意味着我们使用 UrlFetch 的方式存在一些问题。请帮我解决这个问题...

提前致谢...

4

1 回答 1

1

需要凭证来测试这个,所以这取决于你。您可能需要对有效负载进行字符串化和编码。你也有不正确的大写contentType,你可以检查一下UrlFetchApp.getRequest()

function updateProducts_version2a(){
  try{
    var url ="https://app.ecwid.com/api/v1/xxxx/product?id=xxxxx&secure_auth_key="+products_authkey;
    var payload = {price:62755};
    var payload_json = encodeURIComponent(JSON.stringify(payload));
    var options ={method:"put",contentType:"application/json",payload:payload_json,muteHttpExceptions:true};
    var result = UrlFetchApp.fetch(url, options);
    var response = result.getContentText();
    var res_code = result.getResponseCode();
    var x = 1;
  }catch(e){
    Browser.msgBox(e);
  }
}

根据您引用的文档,下一个版本似乎有效 - 通过抑制价格变化并使用商店的 ID,它模仿了产品“获取”。这一次,错误消息可能表明一定程度的成功:“此 Ecwid 帐户无权访问 Ecwid API。请考虑升级它。”

您会注意到 URL 已被分离出来,其中包含产品 ID 和身份验证密钥的基本标头信息。

function updateProducts_version4(){
  try{
    var url ="https://app.ecwid.com/api/v1/xxxx/product";
    var payload = encodeURIComponent(JSON.stringify({
        price:62755
      }));
    var headers = {id:'xxxx',
                   secure_auth_key: 'xxxxxxx'
                  };
    var options = {
      headers:headers,
      method:"put",
      contentType:"application/json",
      muteHttpExceptions:true,
      payload:payload
    };
    var request = UrlFetchApp.getRequest(url, options);  // Debug: check what would be fetched
    var result = UrlFetchApp.fetch(url, options);
    var response = result.getContentText();
    var res_code = result.getResponseCode();
    var respHeaders = result.getHeaders(); ///
    debugger;
  }catch(e){
    Logger.log(e);
    //Browser.msgBox(e);
  }
}

没有你的信任,这是我所能接受的……告诉我们这对你有用。

于 2013-09-15T03:07:33.937 回答