gpt4 book ai didi

node.js - 使用服务帐户获取 401 上传文件到表中

转载 作者:搜寻专家 更新时间:2023-11-01 00:08:42 24 4
gpt4 key购买 nike

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

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

  • gzipped 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--

最佳答案

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

我没有能力毫不费力地向 Google BigQuery 发出请求进行测试,但我会首先将您的选项对象的 headers 属性删除到 request().

删除这个:

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

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

如果您稍微修改代码以打印出发送的实际 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 }

有些服务器不能很好地处理具有相同名称的多个 header 。希望这可以解决 API 中的末端边界缺失错误!

关于node.js - 使用服务帐户获取 401 上传文件到表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18116803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com