Вызов addItem Podio API

Я пытаюсь реализовать https://developers.podio.com/doc/items/add-new-item-22362 Вызов API Podio addItem в модуле nodejs. Вот код:

var _makeRequest = function(type, url, params, cb) {
  var headers = {};
  if(_isAuthenticated) {
    headers.Authorization = 'OAuth2 ' + _access_token ;
  }
  console.log(url,params);
  _request({method: type, url: url, json: true, form: params, headers: headers},function (error, response, body) {
    if(!error && response.statusCode == 200) {
      cb.call(this,body);
    } else {
      console.log('Error occured while launching a request to Podio: ' + error + '; body: ' + JSON.stringify (body));
    }
  });
}

exports.addItem = function(app_id, field_values, cb) {
  _makeRequest('POST', _baseUrl + "/item/app/" + app_id + '/',{fields: {'title': 'fgdsfgdsf'}},function(response) {
    cb.call(this,response);
  });

Он возвращает следующую ошибку:

{"error_propagate":false,"error_parameters":{},"error_detail":null,"error_description":"No matching operation could be found. No body was given.","error":"not_found"}

В приложении требуется только атрибут "title" - я проверил это в графическом интерфейсе Podio. Я также попытался удалить завершающую косую черту с URL-адреса, по которому я отправляю сообщение, затем возникает аналогичная ошибка, но с сообщением URL-адрес не найден в описании ошибки.

Я собираюсь настроить прокси для перехвата сырого запроса, но, может быть, кто-то просто видит ошибку в коде?

Любая помощь приветствуется.


person Alexey    schedule 01.03.2013    source источник


Ответы (2)


Не обращая на это внимания, я нашел решение. Дело в том, что вызов addItem был моей первой «настоящей» реализацией метода -API с параметрами JSON в теле. Предыдущие вызовы были аутентификацией и getApp, который является GET и не имеет никаких параметров.

Проблема в том, что Podio поддерживает пары ключ-значение POST для аутентификации, но не поддерживает это для всех вызовов, и я пытался использовать один метод _makeRequest () для всех вызовов, как auth, так и реальных API.

Похоже, мне нужно реализовать один для аутентификации и один для всех вызовов API.

В любом случае, если кому-то нужно рабочее доказательство концепции для вызова addItem на узле, вот оно (при условии, что у вас заранее есть токен аутентификации)

_request({method: 'POST', url: "https://api.podio.com/item/app/" + app_id + '/', headers: headers, body: JSON.stringify({fields: {'title': 'gdfgdsfgds'}})},function(error, response, body) {
  console.log(body);
});
person Alexey    schedule 01.03.2013

  • Вы должны установить тип содержимого для application / json
  • отправить тело как json со строками.

    const getHeaders = async () => {
      const headers = {
        Accept: 'application/json',
        'Content-Type': 'application/json; charset=utf-8',
      };
    
      const token = "YOUR APP TOKEN HERE";
      headers.Authorization = `Bearer ${token}`;
    
      return headers;
    }
    
    
    const createItem = async (data) => {
        const uri = `https://api.podio.com/item/app/${APP_ID}/`;
        const payload = {
            fields: {
              [data.FIELD_ID]: [data.FIELD_VALUE],
            },
        };
        const response = await fetch(uri, {
            method: 'POST',
            headers: await getHeaders(),
            body: JSON.stringify(payload),
        });
    
        const newItem = await response.json(); 
        return newItem;
    }
    
person M-k    schedule 24.10.2018