繁体   English   中英

Shopify API,对来自 Google Apps Script UrlFetchApp 的 PUT 请求的 406 响应

[英]Shopify API, 406 response for PUT request from Google Apps Script UrlFetchApp

我正在构建一个连接到 Shopify API 的 Google Apps 脚本脚本,以从电子表格创建新产品和/或更新现有产品。 我已成功连接到 API 以获取 GET 请求(列出所有产品)和 POST 请求(创建新产品、更新库存水平),但是在尝试执行 PUT 请求以更新变体价格时,我收到了 406 响应代码.

文档: https : //help.shopify.com/en/api/reference/products/product-variant#update-2019-07

我最初是使用更新产品进行测试,但遇到了同样的问题。 我切换到变体端点,因为我发现它比更新产品更直接。

我尝试将以下代码添加到标题中以帮助响应,但没有任何区别

'Content-Type': "application/json", 
'Accept': "application/json"

我尝试使用 Postman 复制 PUT 请求并成功完成(增加了我的困惑)。 同样,我所有的 GET 和 POST 请求都顺利通过,所以我的 API 凭据不是问题。 我已经检查了端点,一切看起来都是正确的。

这是我一直在测试的代码(甚至硬编码变体 ID 和价格以确保变量没有问题)

function testUpdate(){


  var url = "https://cablemax.myshopify.com/admin/api/2019-07/variants/20731961475134.json"

  var headers = {
    "method": "put",
    "muteHttpExceptions": true,
    "Authorization": "Basic " + Utilities.base64Encode(API_KEY+":"+API_PASSWORD),
    'Content-Type': "application/json", 
    'Accept': "application/json"
  }

  var payload = {
    "variant": {
      "id": 20731961475134,
      "price": "12.44"
    }
  }

  var params = {
    'headers': headers,
    'contentType': "application/json",
    'payload': JSON.stringify(payload),
  }

  try {
    var response = UrlFetchApp.fetch(url, params);
    var responseCode = response.getResponseCode();

    if (responseCode == 200) {
      console.log("Price for: "+ variant_id + " updated successfully"); 
    } else {
      console.log("Price for: "+ variant_id + " failed to update"); 
    }
  } catch(e) {
    console.log("Price update for: " + variant_id + " has failed. Error: " + e); 
  }

}

我不明白这里出了什么问题,因为我所有的其他请求都成功了,并且这个请求(有效负载数据完全相同)在 Postman 中成功了。 捕获响应仅返回

Request failed for https://cablemax.myshopify.com returned code 406

鉴于该请求返回 406,我假设请求的格式而不是有效载荷数据存在错误,但我不知道问题是什么。

您似乎错误地格式化了 params 对象。 请尝试以下操作:

var url = "https://cablemax.myshopify.com/admin/api/2019-07/variants/20731961475134.json";
var params = {
    "method":"put",
    "contentType":"application/json",
    "headers": {
        "Authorization": "Basic " + Utilities.base64Encode(API_KEY+":"+API_PASSWORD)
    },
    "payload": JSON.stringify({
        "variant": {
            "id":20731961475134,
            "price":"12.44"
        }
    })
};

var response = UrlFetchApp.fetch(url, params);

在 Apps Script 中,您不指定Content-Type作为标题; 它被定义为 params 对象上的参数contentType 此外,根据 API 的期望,您可能需要将Utilities.base64Encode()替换为Utilities.base64EncodeWebSafe()

请参阅UrlFetchApp.fetch(url, params)文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM