0

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

这有点令人困惑,因为内容类型格式是 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
    }
}

这告诉我没有创建库存提要。

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

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

任何想法,将不胜感激。

4

1 回答 1

0

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

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);
});
于 2020-05-17T05:44:51.047 回答