3
var data = {
"file": "<InventoryFeed xmlns=\"http://walmart.com/\">\n    <InventoryHeader>\n        <version>1.4</version>\n    </InventoryHeader>\n    <inventory>\n        <sku>JW00726</sku>\n        <quantity>\n            <unit>EACH</unit>\n            <amount>25</amount>\n        </quantity>\n    </inventory>\n    <inventory>\n        <sku>JW00663</sku>\n        <quantity>\n            <unit>EACH</unit>\n            <amount>20</amount>\n        </quantity>\n    </inventory>\n</InventoryFeed>\n"
  };
  
  var options = {
    "method" : "POST",
    "headers": {
        "Authorization": "Basic "+Global_Auth,
        "WM_QOS.CORRELATION_ID": Global_CORRELATION_ID,
        "WM_SVC.NAME": Global_SVC_NAME,
        "WM_SEC.ACCESS_TOKEN":GetAccessToken(),
        "WM_CONSUMER.CHANNEL.TYPE": "#",
        "Accept": "application/json",
        "mimeType": "multipart/form-data",
        "Content-Type": "application/x-www-form-urlencoded"
      },
    "payload" : data,
    "muteHttpExceptions" : true
  };
  var url = "https://marketplace.walmartapis.com/v3/feeds?feedType=inventory";
  var response = UrlFetchApp.fetch(url, options);
  var res = JSON.parse(response.getContentText());

API 応答で 200 (ok) 応答が返されますが、値が Walmart フィードに更新されません。

4

1 に答える 1

3

Walmart APIのエンドポイントについて調べてみるとhttps://marketplace.walmartapis.com/v3/feeds?feedType=inventory、2パターン見つかりました。

  1. これが公式ドキュメントのようです。参照
  2. これはPostmanの「Walmart Partner Apis Prod_Publish」だそうです。参照

この回答では、上記の 2 つのドキュメントを使用して回答を提案したいと思います。

パターン 1:

このパターンでは、公式ドキュメントが使用されます。この場合、データは で送信されmultipart/form-dataます。スクリプトを修正すると、次のようになります。データはスクリプトから使用されます。

変更されたスクリプト:

var data = `<InventoryFeed xmlns="http://walmart.com/"><InventoryHeader><version>1.4</version></InventoryHeader><inventory><sku>JW00726</sku><quantity><unit>EACH</unit><amount>25</amount></quantity></inventory><inventory><sku>JW00663</sku><quantity><unit>EACH</unit><amount>20</amount></quantity></inventory></InventoryFeed>`;
var options = {
  "method": "POST",
  "headers": {
    "Authorization": "Basic " + Global_Auth,
    "WM_QOS.CORRELATION_ID": Global_CORRELATION_ID,
    "WM_SVC.NAME": Global_SVC_NAME,
    "WM_SEC.ACCESS_TOKEN": GetAccessToken(),
    "WM_CONSUMER.CHANNEL.TYPE": "#",
    "Accept": "application/json",
  },
  "payload": { "file": Utilities.newBlob(data, "text/xml") }, // or "application/xml" instead of "text/xml"
  "muteHttpExceptions": true
};
var url = "https://marketplace.walmartapis.com/v3/feeds?feedType=inventory";
var response = UrlFetchApp.fetch(url, options);
var res = JSON.parse(response.getContentText());
  • UrlFetchAppmultipart/form-dataで要求された場合、コンテンツ タイプを設定する必要はありません。境界で自動設定されます。
  • あなたのスクリプトを見たときdata、 のコンテンツ タイプのフォームとして送信されますapplication/x-www-form-urlencoded。これがあなたの問題の理由かもしれないと思いました。

パターン 2:

このパターンでは、Postman の「Walmart Partner Apis Prod_Publish」が使用されます。この場合、データは で送信されapplication/jsonます。そしてサンプルカールは以下の通り。

curl --location --request POST 'https://marketplace.walmartapis.com/v3/feeds?feedType=inventory' \
--header 'WM_SVC.NAME: Walmart Marketplace' \
--header 'WM_QOS.CORRELATION_ID: test' \
--header 'Accept: application/json' \
--header 'WM_SEC.ACCESS_TOKEN: {{token}}' \
--header 'Content-Type: application/json' \
--data-raw '{"InventoryHeader":{"version":"1.4"},"Inventory":[{"sku":"1068155","quantity":{"unit":"EACH","amount":"10"}},{"sku":"10210321","quantity":{"unit":"EACH","amount":"20"}}]}'

これは Google Apps Script に変換されます。

サンプル スクリプト:

var data = {"InventoryHeader":{"version":"1.4"},"Inventory":[{"sku":"JW00726","quantity":{"unit":"EACH","amount":25}},{"sku":"JW00663","quantity":{"unit":"EACH","amount":20}}]};
var options = {
  "method": "POST",
  "headers": {
    "Wm-Qos.Correlation-Id": Global_CORRELATION_ID,
    "Wm-Svc.Name": Global_SVC_NAME,
    "Wm-Sec.Access-Token": GetAccessToken(),
    "Accept": "application/json",
  },
  "contentType": "application/json",
  "payload": JSON.stringify(data),
  "muteHttpExceptions": true
};
var url = "https://marketplace.walmartapis.com/v3/feeds?feedType=inventory";
var response = UrlFetchApp.fetch(url, options);
console.log(response.getContentText())
var res = JSON.parse(response.getContentText());

ノート:

  • "mimeType": "multipart/form-data"リクエストヘッダーでは使用されません。
  • data上記のスクリプトでは、リクエスト ヘッダーの値と値が、API を使用するための正しい値であると想定しています。これは気をつけてください。

参考文献:

于 2021-04-20T02:16:29.477 に答える