使用Axios节点发布Tableau REST API



我正在尝试使用Node和Axios将工作簿发布到tableau REST API。我曾经成功地使用Python发布到API,所以我对API很熟悉。

Tableau提供的文档给出了一个使用AJAX发布的示例:

//Publish Workbook
function publishWorkbook() {
var form = new FormData();
form.append("request_payload", "<tsRequest><workbook name="restWorkbook" ><project id="06ca4b01-f882-4f7a-b4b5-60eb8e8bff8f" ></project></workbook></tsRequest>");
form.append("tableau_workbook", "PATH TO Workbook");
var settings = {
"async": true,
"crossDomain": true,
"url": url + "sites/" + siteid + "/workbooks?overwrite=true",
"method": "POST",
"headers": {
"x-tableau-auth": auth
},
"processData": false,
"contentType": false,
"mimeType": "multipart/mixed",
"data": form
}
$.ajax(settings).done(function(response) {
console.log(response);
});
}

这是我对Axios做同样事情的尝试(https://masteringjs.io/tutorials/axios/form-data):

function publishWorkbook(base_url, site_id, project_id, workbook_filepath, auth_token) {
const url = base_url + `sites/${site_id}/workbooks?overwrite=true`;
const formData = new FormData();
formData.append("request_payload", `<tsRequest><workbook name="test" ><project id="${project_id}"></project></workbook></tsRequest>`);
formData.append("data", fs.createReadStream(workbook_filepath));
const headers = formData.getHeaders();
headers["x-tableau-auth"] =  auth_token;
return axios.post(url, formData, {headers:headers});
}

我收到一个406错误代码。检查FormData显示了一个dataSize: 0,,这看起来很奇怪。有什么想法吗?谢谢

这就是我最终让它工作的方式:

publish = (project_id,workbook_path) => {
return fsp.readFile(workbook_path).then(data => {
const url = this.#site_url + "workbooks?workbookType=twbx&overwrite=true";
var form = new FormData();
const xml_payload = `<tsRequest><workbook name="restWorkbook" ><project id="${project_id}" ></project></workbook></tsRequest>`;
form.append("request_payload", xml_payload, {
filename: "",
contentType: 'text/xml'
});
form.append("tableau_workbook", data, {
filename: path.basename(workbook_path),
contentType: 'application/octet-stream'
});
const form_headers = form.getHeaders()
form_headers['content-type'] = form_headers['content-type'].replace('form-data','mixed')
const config = {
headers: Object.assign({}, this.#auth_header, form_headers)
};
return axios.post(url, form, config);
}).catch(error => {
console.log("publishing failed")
if('response' in error && 'status' in error['response']){
console.log(error['response']['status'],error['response']['statusText'])
console.log(error['response']['data'])
}else{
console.log(error)
}
})
}

最新更新