我使用nodejs和REST与bigquery交互。我正在使用模块进行JWT签名。
我授予了服务帐户写权限。到目前为止,我可以列出项目、列出数据集、创建表和删除表。但是,在通过多部分发布上传文件时,我遇到了两个问题:
我不认为这与我的机器的时间不同步有关,因为其他REST调用按预期工作。
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);
}
);有人能在这上面照点光吗?
P.S. bigquery上的文档在很多方面都不是最新的,希望google的人能够不断更新它。
更新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--发布于 2013-08-08 07:43:51
我自己想出来的。这是一个愚蠢的错误,你会坚持一整天,当你找到解决办法时,你真的会撞到自己的头上。
我通过在浏览器中键入selfLink URL获得401。当然没有授权。
发布于 2013-08-08 06:13:04
您很可能会将重复的content-type头发送到Google。
我没有能力毫不费力地向谷歌BigQuery提出测试请求,但我首先要将options对象的headers属性移到request()上。
删除以下内容:
headers: {
'Content-Type': 'multipart/related'
},Node.js request模块自动检测您在多部分数组中传递了什么,并且它是添加适当的内容类型标头。。如果您提供了您自己的内容类型的标题,您很可能会得到一个“重复”的标题,它不包含多部分边界。
如果您稍微修改代码以打印实际发送的标题:
var req = request({...}, function(..) {...});
console.log(req.headers);对于上面的原始代码(我使用的是Node ),您应该会看到这样的内容:
> 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中缺少的结束边界错误!
https://stackoverflow.com/questions/18116803
复制相似问题