我正在尝试在nodejs模块中实现https://developers.podio.com/doc/items/add-new-item-22362 Podio API addItem调用。这是代码:
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 GUI中检查过该属性。我还尝试从我发布的url中删除尾部斜杠,然后发生类似的错误,但错误描述中的URL not found消息。
我要设置代理来捕获原始请求,但也许有人只是看到代码中的错误?
感谢任何帮助。
答案 0 :(得分:1)
没关系,我找到了解决方案。问题是addItem调用是我在体内使用JSON参数的第一个“真正的”-API方法实现。前一个调用是身份验证和getApp,它是GET并且没有任何参数。
问题是Podio支持POST键值对进行身份验证,但不支持所有调用,我试图对所有调用使用单个_makeRequest()方法,包括auth和real-API那些。
看起来我需要为auth实现一个,并为所有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);
});
答案 1 :(得分:1)
将正文作为字符串解析的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;
}