zabumba
zabumba

Reputation: 12412

How to code Multipart-form POST REQUEST using apollo-datasource-rest

I want to code the multipart-form POST REQUEST below using apollo-datasource-rest

enter image description here enter image description here

My attempt to code this leads to a BAD REQUEST error

const { RESTDataSource } = require('apollo-datasource-rest');

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

class SalesforceApi extends RESTDataSource {
  constructor() {
    super();
    this.initialize({});

    this.getAccessToken()
      .then((accessToken) => {
        this.headers = {
          Authorization: `Bearer ${accessToken}`,
        };
      });
  }

  async getAccessToken() {
    console.log('Getting Salesforce access token');

    try {
      const response = await this.post(
        'https://test.salesforce.com/services/oauth2/token',
        {
          username: 'FILTERED@FILTERED',
          password: `${'FILTERED'}`,
          grant_type: 'password',
          client_id: 'FILTERED',
          client_secret: 'FILTERED',
        },
        {
          headers: {
            'Content-Type': 'multipart/form-data',
          },
        },
      );
      const { accessToken } = response;
      console.log(`ChangeGear sessionId: ${accessToken}`);
      return accessToken;
    } catch (error) {
      console.log(`${error}`);
    }
    return 'No access token!!!';
  }


module.exports = SalesforceApi;
[server:salesforce:local] POST https://test.salesforce.com/services/oauth2/token (343ms)
[server:salesforce:local] Error: 400: Bad Request

Upvotes: 1

Views: 1935

Answers (1)

Idiot211
Idiot211

Reputation: 848

If memory serves correctly, form data is serialized slightly differently hence why the FormData interface exists. And the apollo-datasource-rest's this.post method is just a wrapper around fetch, so something like the below should work.

Instead of passing the body as a JSON object, try something like this

const formData = new FormData();
formData.append('username', 'FILTERED@FILTERED');
// ... more append lines for your data

const response = await this.post(
        'https://test.salesforce.com/services/oauth2/token',
        formData
        {
          headers: {
            'Content-Type': 'multipart/form-data',
          },
        },
      );

Upvotes: 3

Related Questions