Я создаю приложение NodeJS, в котором мне нужно использовать Slack API. Поэтому, используя запрос GET, я вызываю API и получаю ответ в файле gunzip. Как только я разархивирую gunzip, содержимое внутри будет просто данными в формате json.
Я могу вызвать Slack API и получить ответ, но не могу распаковать содержимое файла.
Я обнаружил, что для этого мы можем использовать «сохранение файлов».
Вот код:
const response = await fetch(URL, obj);
if (!response.ok) {
throw new Error(response);
}
// Extract filename from header
const filename = response.headers.get('content-disposition')
.split(';')
.find(n => n.includes('filename='))
.replace('filename=', '')
.trim()
;
const blob = new Blob([JSON.stringify(response.body)], { type: 'text/plain' });
// Download the file
saveAs(blob, filename);
Это не сохраняет ни один файл. Я только что получил ответ от API.
Ответ API:
type: 'default',
url: 'https://slack.com/api/admin.analytics.getFile?type=member&date=2022-09-20&pretty=1',
status: 200,
statusText: 'OK',
headers: {
'access-control-allow-headers': 'slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, x-b3-sampled, x-b3-flags',
'access-control-allow-origin': '*',
'access-control-expose-headers': 'x-slack-req-id, retry-after',
'cache-control': 'private',
connection: 'close',
'content-disposition': `attachment; filename = "Analytics_2022_09_20.json.gz"; filename*=utf-8''Analytics%202022-09-20.json.gz`,
'content-type': 'application/gzip',
date: 'Mon, 10 Oct 2022 04:20:55 GMT',
expires: 'Mon, 26 Jul 1997 05:00:00 GMT',
pragma: 'private',
'referrer-policy': 'no-referrer',
Я также обнаружил, что мы можем использовать «zlib» для извлечения содержимого файла gunzip. Я не мог заставить это работать, вот код:
import {gzip, gunzip} from "zlib";
var options = {
url: URL,
headers: {
'api_key': 'Bearer ' + process.env.accesstoken,
'Content-Type': 'application/json',
'Accept-Encoding': 'gzip'
},
encoding: null
};
request(options, function(err, response, body){
var encoding = response.headers['content-encoding']
if (encoding && encoding.indexOf('gzip') >= 0) {
gunzip(body, function(err, dezipped) {
var json_string = dezipped.toString('utf-8');
var json = JSON.parse(json_string);
console.info('JSON content: ',json);
});
} else {
console.info('not gzipped!');
}
})
В этом ответ, который я получаю от самого API, отличается. Как еще я могу извлечь содержимое файла gunzip? Любые предложения были бы замечательными!
@saisuresh Добавление base64 не сработало
Это код, который работал для меня:
request(URL, { //fetch slack data from API
headers: {
Authorization: 'Bearer ' + process.env.accesstoken,
}})
.pipe(zlib.createGunzip())
.pipe(
concat((stringBuffer) => {
result = stringBuffer.toString()
fs.writeFileSync('gzip-file.json', result, (error) => {
if (error) throw error;
});
})
);
Можете ли вы попробовать преобразовать большой двоичный объект в base64, а затем попытаться сохранить его...