【问题标题】:Getting 401 uploading file into a table with a service account使用服务帐户将 401 文件上传到表中
【发布时间】:2013-08-09 14:55:03
【问题描述】:

我正在使用 nodejs 和 REST API 与 bigquery 进行交互。我正在使用 google-oauth-jwt 模块进行 JWT 签名。

我授予了服务帐户写入权限。到目前为止,我可以列出项目、列出数据集、创建表和删除表。但是当通过multipart POST上传文件时,我遇到了两个问题:

  • gzip 压缩的 json 文件不起作用,我收到一条错误消息,提示“缺少结束边界”
  • 当我使用未压缩的 json 文件时,我收到 401 未经授权的错误

我认为这与我的机器时间不同步有关,因为其他 REST api 调用按预期工作。

var url = 'https://www.googleapis.com/upload/bigquery/v2/projects/' + projectId + '/jobs';
    var request = googleOauthJWT.requestWithJWT();
    var jobResource = {
        jobReference: {
            projectId: projectId,
            jobId: jobId
        },
        configuration: {
            load: {
                sourceFormat: 'NEWLINE_DELIMITED_JSON',
                destinationTable: {
                    projectId: projectId,
                    datasetId: datasetId,
                    tableId: tableId
                },
                createDisposition: '',
                writeDisposition: ''
            }
        }
    };
    request(
            {
                url: url,
                method: 'POST',
                jwt: jwtParams,
                headers: {
                    'Content-Type': 'multipart/related'
                },
                qs: {
                    uploadType: 'multipart'
                },
                multipart: [
                    {
                        'Content-Type':'application/json; charset=UTF-8',
                        body: JSON.stringify(jobResource)
                    },
                    {
                        'Content-Type':'application/octet-stream',
                        body: fileBuffer.toString()   
                    }
                ]
            },
            function(err, response, body) {
                console.log(JSON.parse(body).selfLink);
            }
        );

任何人都可以对此有所了解吗?

附: bigquery REST api 的文档在很多方面都不是最新的,希望谷歌的人可以保持更新

更新 1:

这是完整的 HTTP 请求:

POST /upload/bigquery/v2/projects/239525534299/jobs?uploadType=multipart HTTP/1.1
content-type: multipart/related; boundary=71e00bd1-1c17-4892-8784-2facc6998699
authorization: Bearer ya29.AHES6ZRYyfSUpQz7xt-xwEgUfelmCvwi0RL3ztHDwC4vnBI
host: www.googleapis.com
content-length: 876
Connection: keep-alive

--71e00bd1-1c17-4892-8784-2facc6998699
Content-Type: application/json

{"jobReference":{"projectId":"239525534299","jobId":"test-upload-2013-08-07_2300"},"configuration":{"load":{"sourceFormat":"NEWLINE_DELIMITED_JSON","destinationTable":{"projectId":"239525534299","datasetId":"performance","tableId":"test_table"},"createDisposition":"CREATE_NEVER","writeDisposition":"WRITE_APPEND"}}}
--71e00bd1-1c17-4892-8784-2facc6998699
Content-Type: application/octet-stream

{"practiceId":2,"fanCount":5,"mvp":"Hello"}
{"practiceId":3,"fanCount":33,"mvp":"Hello"}
{"practiceId":4,"fanCount":71,"mvp":"Hello"}
{"practiceId":5,"fanCount":93,"mvp":"Hello"}
{"practiceId":6,"fanCount":92,"mvp":"Hello"}
{"practiceId":7,"fanCount":74,"mvp":"Hello"}
{"practiceId":8,"fanCount":100,"mvp":"Hello"}
{"practiceId":9,"fanCount":27,"mvp":"Hello"}

--71e00bd1-1c17-4892-8784-2facc6998699--

【问题讨论】:

    标签: node.js google-bigquery jwt


    【解决方案1】:

    您很可能会向 Google API 发送重复的 content-type 标头。

    我无法轻松地向 Google BigQuery 发出测试请求,但我会先将您的选项对象的 headers 属性删除到 request()

    删除这个:

    headers: {
      'Content-Type': 'multipart/related'
    },
    

    Node.js request 模块自动检测到您传入了一个多部分数组,它是adds the appropriate content-type header。如果您提供自己的内容类型标头,您很可能会得到一个“重复”的标头,其中不包含多部分边界。

    如果您稍微修改代码以打印出实际发送的标头:

    var req = request({...}, function(..) {...});
    
    console.log(req.headers);
    

    您应该在上面的原始代码中看到类似这样的内容(我使用的是 Node REPL):

    > req.headers
    { 'Content-Type': 'multipart/related',
      'content-type': 'multipart/related; boundary=af5ed508-5655-48e4-b43c-ae5be91b5ae9',
      'content-length': 271 }
    

    如果您删除显式 headers 选项,则以下内容:

    > req.headers
    { 'content-type': 'multipart/related; boundary=49d2371f-1baf-4526-b140-0d4d3f80bb75',
      'content-length': 271 }
    

    有些服务器不能很好地处理具有相同名称的多个标头。希望这可以解决 API 中的 end boundary missing 错误!

    【讨论】:

    • 谢谢@hallmark,但这不是问题所在。我会将 http 请求添加到帖子中
    【解决方案2】:

    这是我自己想出来的。这是那些愚蠢的错误之一,会让你坚持一整天,最后当你找到解决方案时,你真的会敲自己的脑袋。

    我通过在浏览器中输入 selfLink URL 得到了 401。当然是没有授权的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多