Приложение Zapier: отправить тело с запросом GET

Я делаю интеграцию для intouch api в Zapier. По какой-то причине API настроен на получение запросов в body из GET запросов, а не в параметрах.

Все это работает в Postman, но кажется, что функция z.request игнорирует атрибут опции body с GET запросами.

Вот мой код:

const test = (z, bundle) => {
  const query = {
    matterGuid: "bf508fcf-5f36-4191-93d6-fecd5a7f6a04",
    getFields: ["matter.reference"],
  };

  return z.request({
    method: "GET",
    url: baseUrl + "/matters",
    body: JSON.stringify(query), //I've tried body, json, raw, data, etc
  });
};

И вот ответ, который я получаю:

{
      status: 400,
      json: { message: 'No request data received', success: false, errors: [] },
      data: { message: 'No request data received', success: false, errors: [] },
      content: '{"message":"No request data received","success":false,"errors":[]}',
      request: {
        method: 'GET',
        headers: {
          'user-agent': 'Zapier',
          'x-intouch-o-token': 'xxxxxxxxxxxxxxxxxxx',
          'Content-Type': 'application/json; charset=utf-8'
        },
        url: 'https://demo.intouch.cloud/api/v2/public/matters',
        _addContext: [Function: addContext],
        input: {
          bundle: [Object],
          _zapier: [Object],
          _addContext: [Function: addContext]
        },
        merge: true,
        removeMissingValuesFrom: { params: false, body: false },
        replace: true,
        skipThrowForStatus: false,
        _requestStart: 2020-10-24T11:42:37.026Z
      },
      skipThrowForStatus: false,
      headers: Headers {
        [Symbol(map)]: [Object: null prototype] {
          date: [Array],
          'content-type': [Array],
          'content-length': [Array],
          connection: [Array],
          'set-cookie': [Array],
          'access-control-allow-origin': [Array],
          'access-control-allow-headers': [Array],
          'access-control-allow-methods': [Array],
          'x-content-type-options': [Array],
          'arr-disable-session-affinity': [Array],
          'x-frame-options': [Array],
          'strict-transport-security': [Array],
          'cf-cache-status': [Array],
          'cf-request-id': [Array],
          'expect-ct': [Array],
          'report-to': [Array],
          nel: [Array],
          server: [Array],
          'cf-ray': [Array]
        }
      },
      getHeader: [Function: getHeader],
      throwForStatus: [Function],
      _addContext: [Function: addContext]
    }

person Dave Cook    schedule 24.10.2020    source источник
comment
Изучив это, я выяснил, почему это происходит. Это связано с этой строкой в ​​коде запросов Zapier: // No need for body on get if (req.method === 'GET') { delete req.body; `}` github.com/zapier/zapier-platform-core/blob/master/src/   -  person Dave Cook    schedule 24.10.2020


Ответы (1)


Возможно, это не идеальное решение, но я нашел обходной путь.

Я обнаружил, что как часть промежуточного программного обеспечения в z.request методе, body явно удаляется из GET запросов.

// No need for body on get
  if (req.method === 'GET') {
    delete req.body;
  }

В результате я смог добавить дополнительное промежуточное программное обеспечение, чтобы вернуть тело обратно. К счастью, пользовательские функции промежуточного программного обеспечения, добавленные в массив before, выполняются после собственного промежуточного программного обеспечения Zapier, что означает, что на тело не повлияла функция, указанная выше.

Вот что я придумал, чтобы обойти это:

const includeQuery = (request, z, bundle) => {
  if (request.method ==='GET'){
    if (bundle.inputData.matterGuid && bundle.inputData.getFields){
      const query = {
        matterGuid: bundle.inputData.matterGuid,
        getFields: bundle.inputData.getFields.split(','),
      };
      request.body = JSON.stringify(query);
    }    
  }

  return request;
};

Затем он был добавлен в массив befores в экспортируемом объекте, например:

  befores: [includeApiKey, includeQuery],
  afters: [handleBadResponses],

Мне было бы очень интересно услышать, есть ли у кого-нибудь лучшее решение этой проблемы.

person Dave Cook    schedule 25.10.2020
comment
Ваше решение - правильное - согласно этому ответу тело GET запроса не должно ' t содержат данные и должны игнорироваться сервером, поэтому Zapier удаляет их. - person xavdid; 30.10.2020