【问题标题】:How to send Walmart API Update Bulk Inventory request using node and json?如何使用节点和 json 发送 Walmart API Update Bulk Inventory 请求?
【发布时间】:2020-05-15 14:52:18
【问题描述】:

我正在尝试弄清楚如何向沃尔玛的更新批量库存 POST 端点发送成功的请求。

这有点令人困惑,因为 content-type 格式是 multipart/form-data 这意味着用户需要提供文件。但是对于我的用例来说这是不可能的,因为我只有一个 JS 对象可以使用。

但是查看 Walmart 的文档显示了一个以 JSON 格式发送的示例请求,因此我采用了以下方法:

const jsonData = JSON.stringify({
        InventoryHeader: {
            version: '1.4',
        },
        Inventory: walmartData.inventory_items.reduce(
            (acc, { sku, quantity }) => {
                acc.push({
                    sku: encodeSku(sku),
                    quantity,
                });
                return acc;
            },
            [],
        ),
    });

    const data = new FormData();

    data.append('json', jsonData);

    const needleOpts = {
        headers: {
            ...data.getHeaders(),
            ...buildHeaders(), // builds auth headers 
        },
    };

    const queryObject = {
        feedType: 'inventory',
        shipNode: 'xyz,
    };

    const query = queryString.stringify(queryObject, {
        encode: false,
        arrayFormat: 'bracket',
    });

    const url = `https://sandbox.walmartapis.com/v3/feeds?${query}`;

    const result = await needle('post', url, data, needleOpts);

    return result.body;

问题是我得到了一个 feedId,它表明响应是成功的,但是当我尝试获取 feed 时,我得到了以下错误:

{
    "feedId": "3DD1DE30885E45BA8EB1CBFC94A41FEA@AQkBAQA",
    "feedStatus": "ERROR",
    "shipNode": null,
    "submittedBy": null,
    "ingestionErrors": {
        "ingestionError": [
            {
                "type": "SYSTEM_ERROR",
                "code": "PDR-0014",
                "field": null,
                "description": "INTERNAL SERVER ERROR"
            }
        ]
    },
    "itemsReceived": 0,
    "itemsSucceeded": 0,
    "itemsFailed": 0,
    "itemsProcessing": 0,
    "offset": 0,
    "limit": 50,
    "itemDetails": {
        "itemIngestionStatus": []
    },
    "additionalAttributes": null
}

此外,当我尝试获取所有库存提要时,我会返回以下内容:

{
    "totalResults": 0,
    "offset": 0,
    "limit": 50,
    "results": {
        "feed": null
    }
}

这告诉我没有创建库存 Feed。

据我所知,我的代码看起来还不错,但我不明白为什么没有创建提要,还要注意的是,API 是沙盒这一事实不应该有所作为。

是否有人对此 API 有任何经验,尤其是使用 JSON 发送请求? JSON 对象应该是文件格式吗?

任何想法都将不胜感激。

【问题讨论】:

  • 文档指定您需要将有效负载放入文件中并使用 multipart/form-data 上传文件。我已经添加了一个答案,所以试试看是否有效。

标签: javascript json api multipartform-data walmart-api


【解决方案1】:

试试这个。这是使用请求库,但您可以尝试将其添加到您的代码中,并稍作改动。

var request = require('request');
var fs = require('fs');
var options = {
  'method': 'POST',
  'url': 'URL GOES HERE',
  'headers': {
    'WM_SVC.NAME': 'Walmart Marketplace',
    'WM_QOS.CORRELATION_ID': 'test',
    'Accept': 'application/xml',
    'WM_SEC.ACCESS_TOKEN': 'TOKEN',
    'Content-Type': 'multipart/form-data',
    'Authorization': 'Basic ....'
  },
  formData: {
    'file': {
      'value': fs.createReadStream('path/to/file'),
      'options': {
        'filename': 'inventory.xml'
      }
    }
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

【讨论】:

  • 感谢@kushan85 的回复。所以我的用例要求我将数据作为 JSON 发送。当我将数据输入我的应用程序时,它是一个 JS 对象,然后我将其转换为 JSON。 atm 当我将数据作为 JSON 字符串发送时,或者即使我首先将 JSON 写入文件然后加载该文件,它似乎仍然无法正常工作。我目前正在沙盒上进行测试,你知道这是否会影响行为吗?
  • 您正在尝试沙盒?这有帮助。沙盒库存提要存在问题,今天已修复并推送,因此您可以重试。开发者门户上的示例请求不正确。数量下的金额需要是整数而不是字符串。这应该有效。告诉我
  • @thexyman 你能以 JSON 格式发送吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2018-11-22
  • 2015-12-06
相关资源
最近更新 更多