【问题标题】:UrlFetch put method using Google Apps Script使用 Google Apps 脚本的 UrlFetch put 方法
【发布时间】:2013-09-18 21:46:00
【问题描述】:

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

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

API:ECWID 产品 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 的方式存在一些问题。请帮我解决这个问题...

提前谢谢...

【问题讨论】:

  • 只是需要将有效载荷放在引号中吗?
  • 您是否尝试过使用“调试”选项(您可能必须删除您的尝试)?然后您将能够准确地看到有效载荷的样子。我很好奇哪条线抛出了错误。我没有对该服务的信任,但我在 UrlFetchApp.fetch 行上收到了预期的 400 错误。
  • @patto: 尝试将对象放在下面的引号中,然后也得到与以前相同的错误:var payload = "{price:62758}";
  • @fobby: 以下是调试模式下的内容:payload Object (207294512) ({price:62758}) price number 62758 .. 它在 URLFetchApp.fetch 失败并出现上述错误跨度>
  • 为什么在 v4 中有两个“选项”?第二个省略了标题...

标签: javascript json rest google-apps-script


【解决方案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,它模仿了产品“get”。这一次,错误消息可能表明一定程度的成功:“此 Ecwid 帐户无权访问 Ecwid API。请考虑升级它。”

您会注意到 URL 已被分离出来,与产品 ID 和 auth 密钥的基本标头信息一起。

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);
  }
}

没有你的信任,我能接受的就是这样......告诉我们这对你有什么作用。

【讨论】:

  • 感谢您对此进行调查并提供建议。不幸的是,它没有用。您可以找到错误消息如下: updateProducts_version2a response: "{ "error": "OTHER", "errorMessage": "Error parsing JSON: A JSONObject text must begin with '{' at character 1" }" response_code: 400
  • 第二个建议:使用提供的代码给我内部服务器错误(error_code:500),这也不起作用。感谢您的建议,如果有任何其他选项可用,请通过查看错误代码告诉我
  • 最好还是回到第一原则。您是否有可用于执行操作的 URL?首先在 [hurl](www.hurl.it) 上进行测试。一旦你有了它,那么问题就变成了如何在你的脚本中重新创建它。
  • 已经用类似的(Chrome中的Dev HTTP客户端)测试了相同的选项,具有以下选项:url:app.ecwid.com/api/v1/xxxx/…方法:放置数据:{price:62755}它在这里工作得很好,但不是剧本。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多