Shopify API,来自 Google Apps 脚本 UrlFetchApp 的 PUT 请求的 406 响应

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

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

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

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

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

'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 中也成功了。捕获响应只是 returns

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

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

您的参数格式似乎不正确 object。请尝试以下操作:

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 脚本中,您没有将 Content-Type 指定为 header;它被定义为 params object 上的参数 contentType。此外,根据 API 的期望,您可能需要替换 Utilities.base64Encode() with Utilities.base64EncodeWebSafe().

请参阅 UrlFetchApp.fetch(url, params)

的文档