fetch-har

Make a fetch request from a HAR definition

Usage no npm install needed!

<script type="module">
  import fetchHar from 'https://cdn.skypack.dev/fetch-har';
</script>

README

fetch-har

CI

Make a fetch request from a HAR definition.

Installation

npm install --save fetch-har

Usage

require('isomorphic-fetch');

// If executing from an environment that dodoesn't normally provide `fetch()`
// we'll automatically polyfill in the `Blob`, `File`, and `FormData` APIs
// with the optional `formdata-node` package (provided you've installed it).
const fetchHar = require('.');

const har = {
  log: {
    entries: [
      {
        request: {
          headers: [
            {
              name: 'Authorization',
              value: 'Bearer api-key',
            },
            {
              name: 'Content-Type',
              value: 'application/json',
            },
          ],
          queryString: [
            { name: 'a', value: 1 },
            { name: 'b', value: 2 },
          ],
          postData: {
            mimeType: 'application/json',
            text: '{"id":8,"category":{"id":6,"name":"name"},"name":"name"}',
          },
          method: 'POST',
          url: 'http://httpbin.org/post',
        },
      },
    ],
  },
};

fetchHar(har)
  .then(res => res.json())
  .then(console.log);

API

If you are executing fetch-har in a browser environment that supports the FormData API then you don't need to do anything. If you arent, however, you'll need to polyfill it.

Unfortunately the most popular NPM package form-data ships with a non-spec compliant API, and for this we don't recommend you use it, as if you use fetch-har to upload files it may not work.

Though we recommend either formdata-node or formdata-polyfill we prefer formdata-node right now as it's CJS-compatible.

Options

userAgent

A custom User-Agent header to apply to your request. Please note that browsers have their own handling for these headers in fetch() calls so it may not work everywhere; it will always be sent in Node however.

await fetchHar(har, { userAgent: 'my-client/1.0' });
files

An optional object map you can supply to use for multipart/form-data file uploads in leu of relying on if the HAR you have has data URLs. It supports Node file buffers and the File API.

await fetchHar(har, { files: {
  'owlbert.png': await fs.readFile('./owlbert.png'),
  'file.txt': document.querySelector('#some-file-input').files[0],
} });

If you don't supply this option fetch-har will fallback to the data URL present within the supplied HAR. If no files option is present, and no data URL (via param.value) is present in the HAR, a fatal exception will be thrown.

multipartEncoder

❗ If you are using fetch-har in Node you may need this option to execute multipart/form-data requests!

If you are running fetch-har within a Node environment and you're using node-fetch@2, or another fetch polyfill that does not support a spec-compliant FormData API, you will need to specify an encoder that will transform your FormData object into something that can be used with Request.body.

We recommend form-data-encoder.

const { FormDataEncoder } = require('form-data-encoder');

await fetchHar(har, { multipartEncoder: FormDataEncoder });

You do not, and shouldn't, need to use this option in browser environments.