【问题标题】:Tableau REST API Publishing with Axios Node使用 Axios 节点发布 Tableau REST API
【发布时间】:2021-03-13 20:54:04
【问题描述】:

我正在尝试使用 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,,这看起来很奇怪。有什么想法吗?谢谢!

【问题讨论】:

  • mimeType 不是请求标头。
  • 好点,我刚刚注意到示例使用:headers: formData.getHeaders()
  • 啊,是的,如果你在 Node 中使用它,我相信你应该这样做
  • 我只是试了一下,没有运气......

标签: javascript node.js ajax axios tableau-api


【解决方案1】:

这就是我最终得到它的方式:

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)
        }
    })
}

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 2016-12-31
    • 2019-12-08
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2019-03-05
    • 2016-09-01
    相关资源
    最近更新 更多