У меня проблемы с рекламным API Amazon. Я использую библиотеку nodejs (https://github.com/humanstupidity/amazon-advertising-api), чтобы получить отчет от amazon, который возвращает мне тело, которое кажется двоичным, но я не могу сделать его читаемым в JSON.
Я попробовал запрос в почтальоне, и он возвращает тот же двоичный ответ. Мне нужно скачать и распаковать файл из почтальона, чтобы он был читабельным, но я почему-то не могу заставить его работать в nodeJS.
Это часть внутри библиотеки, которая важна:
const request = require('request');
const util = require('util');
const requestPromise = util.promisify(request);
const postRequestPromise = util.promisify(request.post);
const getRequestPromise = util.promisify(request.get);
module.exports = class AdvertisingClient {
async getReport(reportId) {
while (true) {
let reportRequest = JSON.parse(await this._operation(`sp/reports/${reportId}`));
if (reportRequest.status === 'SUCCESS') {
return this._download(reportRequest.location);
}
await sleep(500);
}
}
_download(location, auth = true)
{
let headers = {}
if (auth) {
headers.Authorization = 'Bearer ' + this.options.accessToken;
}
if (this.options.profileId) {
headers['Amazon-Advertising-API-Scope'] = this.options.profileId;
}
let requestOptions = {
url: location,
headers: headers,
followRedirect: false,
gzip: true
}
return this._executeRequest(requestOptions);
}
async _executeRequest(requestOptions){
let response = await getRequestPromise(requestOptions);
if (response.statusCode == 307) {
let finalResult = await this._download(response.headers.location, false);
return finalResult;
}
let result={
success: false,
code: response.statusCode,
response: response.body,
requestId: 0
};
console.log(result);
if (!(response.statusCode < 400 && response.statusCode >= 200)) {
let data = JSON.parse(response.body);
if (data && data.requestId) {
requestId = data.requestId;
}
result = false;
} else {
result.success = true;
}
return result
}
async _operation(_interface, data, method = 'GET') {
let url = `https://${this.endpoint}/v2/${_interface}`;
let headers = {
'Authorization': 'Bearer ' + this.options.accessToken,
'Amazon-Advertising-API-ClientId': this.options.clientId,
'Content-Type': 'application/json',
}
if (this.options.profileId) {
headers['Amazon-Advertising-API-Scope'] = this.options.profileId;
}
let requestOptions={
url: url,
headers: headers,
method: method,
gzip: true,
}
if (method=="GET") {
requestOptions.qs=data;
}else{
requestOptions.json=data;
}
let response = await requestPromise(requestOptions)
let resData = response.body;
if (!resData.error) {
return resData;
} else {
throw resData.error;
}
}
}
Я вызываю код с помощью функции:
let reportResult = await client.getReport(reportID);
И вот результат, который я получаю:
{
success: false,
code: 200,
response: '\u001f�\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000���j�@\u0010\u0006�{�B<�\u0010�������P�\u0016�[���M�F\r\u001a\u000b����\u0002y�nӖ�!�7����7�O\u001faRT�p�Fa\u0012g�8}�g�p\u0002H\\\u0019�H�����.M^��4ۗ���"�Z�\u0016q��I8��MR:��y3�\u001a/�F�P3\u0004�C�\u0017�t\\\u0017Y\u001a��\u001b��v��Hf��(`��0�+֧�g�8��]\u000b\u0019\u0013�\u001d-I\u001b.%��g��`���$���\u001f(��f~�tʐ�`H�/C���\u0011�>\u0014M\u0000�Fw\f��\u001b\u0018���\f�71`.���]Ev9[4\r1��5��!�˥�i\u0018�m�\u001c�R�=3��I�VL(����t�~sm_��\\i!\u0005\n' +
'�٠�aU���=��e�\u0007KW�Ypk�z(��Q��\u0003\u0013$`�em\u0010�\u0018=�d�����}���y3��\u000b.��=9\u0004\u0000\u0000',
requestId: 0
}
Я также поиграл с zlib, но получил только ошибка Error: unexpected end of file
Я довольно новичок в nodeJS и действительно не знаю, в чем проблема.
Заранее большое спасибо за вашу помощь!