如何使用 apollo-datasource-rest 编写 Multipart-form POST REQUEST

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

我想使用 apollo-datasource-rest

对下面的多部分形式 POST REQUEST 进行编码

我尝试对此进行编码导致 BAD REQUEST 错误

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

如果内存正常运行,表单数据的序列化略有不同,这就是 FormData 接口存在的原因。 apollo-datasource-restthis.post 方法只是 fetch 的包装器,所以像下面这样的东西应该可以工作。

与其将正文作为 JSON 对象传递,不如尝试这样的方法

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',
          },
        },
      );