0

I am making POST requests to an API and I want to make three requests as efficient and with less code as possible. Currently my code works, but it sends only the first object, instead of all three, what is the most efficient way to make three API calls? Here is my attempt so far:

import fetch from 'node-fetch';
import xlsx from 'xlsx';
const baseUrl = "";
const apiToken = "";
const wb = xlsx.readFile('users.xlsx');
const ws = wb.Sheets['users'];
const data = xlsx.utils.sheet_to_json(ws);

let [obj1, obj2, obj3] = data

const optionsForFirstUser = {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiToken}`,
    "gtmhub-accountid": accountId,
    "Content-type": "application/json; charset=UTF-8",
    Accept: "application/json, text/plain, */*",
  },
 

  body: JSON.stringify(
    obj1
  ),
};

const optionsForSecondUser = {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiToken}`,
    "gtmhub-accountid": accountId,
    "Content-type": "application/json; charset=UTF-8",
    Accept: "application/json, text/plain, */*",
  },
 

  body: JSON.stringify(
    obj1
  ),
};

const optionsForThirdUser = {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiToken}`,
    "gtmhub-accountid": accountId,
    "Content-type": "application/json; charset=UTF-8",
    Accept: "application/json, text/plain, */*",
  },
 

  body: JSON.stringify(
    obj1
  ),
};


const createUser = (url, settings) => {
  return fetch(`${url}/users`, settings)
    .then((response) => response.text())
    .then((data) => console.log(data))
    .catch((error) => {
      console.log(error.message);
    });
};

createUser(baseUrl, optionsForFirstUser, optionsForSecondUser, optionsForThirdUser);

I can't use an array, because the API doesn't allow it. It needs to be just JSON objects.

codePanda
  • 21
  • 2
  • You need to call `fetch()` 3 times, I only see 1 fetch call! – Evert Sep 22 '21 at 19:46
  • Pass an array of options (`[optionsForFirstUser, optionsForSecondUser, optionsForThirdUser]`) and then have `createUser` return an array of promises, one per fetched option via `settings.map`. – jarmod Sep 22 '21 at 19:52
  • @jarmod do you have a code example for that? – codePanda Sep 22 '21 at 20:13
  • I provided an example of how to use promises to capture the results of 3 POSTs. – jarmod Sep 27 '21 at 11:15

1 Answers1

1

Here is a working example that sends multiple POST requests to a test Postman API:

const fetch = require("node-fetch");

const baseUrl = "https://postman-echo.com/post";

const obj1 = { id: 1, name: "one" };
const obj2 = { id: 2, name: "two" };
const obj3 = { id: 3, name: "three" };

const options1 = {
  method: "POST",
  headers: {
    "Content-type": "application/json; charset=UTF-8",
    Accept: "application/json, text/plain, */*",
  },
  body: JSON.stringify(obj1),
};

const options2 = {
  method: "POST",
  headers: {
    "Content-type": "application/json; charset=UTF-8",
    Accept: "application/json, text/plain, */*",
  },
  body: JSON.stringify(obj2),
};

const options3 = {
  method: "POST",
  headers: {
    "Content-type": "application/json; charset=UTF-8",
    Accept: "application/json, text/plain, */*",
  },
  body: JSON.stringify(obj3),
};

const createUser = (url, options) => {
  return options.map((option) => fetch(url, option));
};

(async () => {
  const promises = createUser(baseUrl, [options1, options2, options3]);

  try {
    const rc = await Promise.all(promises);
    console.log(rc);
  } catch (e) {
    console.log("Caught error: ", e);
  }
})();
jarmod
  • 71,565
  • 16
  • 115
  • 122