使用fetch.js启用gzip压缩

时间:2017-08-29 15:53:47

标签: javascript json gzip fetch

我使用fetch.js(https://github.com/github/fetch)向后端发送一个相对较大的json对象。 json很大,因为它包含一个SVG图像字符串。

我不清楚fetch.js是否默认使用gzip压缩,或者我是否需要手动压缩和添加标头。任何帮助将不胜感激。

override func update(_ currentTime: TimeInterval) { timer += 1 if timer > spawntime { makeCirc() timer = 0 } if circCount > 0 { if (self.childNode(withName: "white circ")?.position.y)! > self.frame.maxY - 100 { self.childNode(withName: "white circ")?.removeFromParent() circCount -= 1 } } }

2 个答案:

答案 0 :(得分:2)

我假设用你的

body: JSON.stringify(payload)

有效负载未被压缩。

我还希望能够压缩/压缩有效负载主体,我还需要一种异步方法来适应我的其余代码。我正在努力寻找的方法是在没有回调的情况下使用zlib。

为实现这一目标,我做了以下事情......

在单独的帮助库中,我导入zib ...

import zlib from 'zlib'

我创建了以下功能....

async function asyncCompressBody(body) {

    const compressedData = await compressBody(body);
    console.log("Data Compressed");

    return compressedData;

}

function compressBody(body) {

    return new Promise( function( resolve, reject ) {

        zlib.deflate(body, (err, buffer) => {
            if(err){
                console.log("Error Zipping");
                reject(err);
            }

            console.log("Zipped");

            resolve(buffer);
        });
    });

}

compressBody函数是围绕zlib.deflate的一个承诺。 asyncCompressBody函数是一个异步函数,允许调用函数等待。

在调用函数中,我将它用作...

let compressedBody = await asyncCompressBody(jsonContent);

let headers = new Headers();
headers.append("Content-Type","application/json");
headers.append("Content-Encoding","zlib");

const response = await fetch(url,
    {method: 'POST',
    headers:headers,
    body:compressedBody});

答案 1 :(得分:1)

使用https://github.com/nodeca/pako(zlib的更快端口)。

添加以下导入:

import { gzip } from 'pako';

然后更改:

body: JSON.stringify(payload)

收件人:

body: await gzip(JSON.stringify(payload))

并添加标题:

'Content-Encoding': 'gzip',

或者,如果您不使用await / async语法,则示例代码将变为:

return new Promise((resolve, reject) => {
  gzip(JSON.stringify(payload)).then((gzippedBody) => {
    fetch(api_base + "/api/save-photo", {
      method: 'POST',
      mode: 'cors',
      headers: {
        'Content-Encoding': 'gzip',
        'Content-Type': 'application/json'
      },
      body: gzippedBody
    })
      .then((response) => {
        if (response.status === 404) {
          throw new Error('404 (Not Found)');
        } else {
          return response.json().then((json) => {
            console.log('save poster response: ', json);
            return json;
          });
        }
      });
  });
});