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()
.
的文档
我正在构建连接到 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()
.