我正在使用Nodejs与GoogleApis v35.0.0连接,以告诉Google更新或从Google索引中删除页面。然后我通过Google indexing batch request发送请求时卡住了多部分/混合请求,即多部分正文。
我可以按照indexing API documentation向Google发送单个页面更新请求。但是由于Google的配额有限,每天最多只能有200个请求,因此我需要更新的URL还要更多。因此,我正在尝试使用Google索引批处理请求,该请求最多可以将100个单独的请求分组,并且算作1个请求。
当我尝试分批发送请求时,我遇到了多部分主体格式正确的问题。我正在使用GoogleApis的JWT(JSON Web令牌)(从oauth2扩展为对我的帐户进行身份验证),并使用request library v2.88.0将请求发送给Google。
因为请求库已经处理了多部分边界,所以我不将其作为请求选项信息之一发送。我还检查了请求npm库的multipart / mixed中的信息,但我只发现了multipart / related(https://github.com/request/request#multipartrelated)类似但不相同的信息。
根据Google中的一个批处理请求正文示例,我需要在主请求中使用multipart / mixed作为内容类型:
POST /batch HTTP/1.1
Host: indexing.googleapis.com
Content-Length: content_length
Content-Type: multipart/mixed; boundary="===============7330845974216740156=="
Authorization: Bearer oauth2_token
--===============7330845974216740156==
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+2>
POST /v3/urlNotifications:publish [1]
Content-Type: application/json
accept: application/json
content-length: 58
{ "url": "http://example.com/jobs/42", "type": "URL_UPDATED" }
这是我的代码:
return jwtClient.authorize(function(err, tokens) {
if (err) {
console.log(err);
return;
}
let options = {
url: 'https://indexing.googleapis.com/batch',
method: 'POST',
headers: {
'Content-Type': 'multipart/mixed'
},
auth: { 'bearer': tokens.access_token },
multipart: [
{
body: JSON.stringify({
headers: {
'Content-Type': 'application/http'
},
method: 'POST',
url: 'https://indexing.googleapis.com/v3/urlNotifications:publish',
body: {
'Content-Type': 'application/json',
url: 'https://www.test.com/es/1234',
type: 'URL_UPDATED'
}
})
}
]
};
request(options, function (error, response, body) {
console.log(body);
});
});
我在multipart的正文中遇到错误,我不知道google indexing批处理请求正在等待哪种正文。似乎multipart主体中的所有内容都被视为标头。但是根据批处理请求格式的文档,它说:“每个部分都以其自己的Content-Type开头:application / http HTTP标头。每个部分的主体本身就是一个完整的HTTP请求,带有其自身的动词,URL,标头和正文”。有关更多详细信息,请检查:https://cloud.google.com/storage/docs/json_api/v1/how-tos/batch。
但是,执行代码时出现以下错误:
{
"error": {
"code": 400,
"message": "Failed to parse batch request, error: Failed in parsing HTTP headers: {\"Content-Type\":\"application/http\",\"method\":\"POST\",\"url\":\"https://indexing.googleapis.com/v3/urlNotifications:publish\",\"body\":{\"Content-Type\":\"application/json\",\"url\":\"https://www.test.com/es/1234\",\"type\":\"URL_UPDATED\"}}\n. Received batch body: ",
"status": "INVALID_ARGUMENT"
}
}
有人请求Google索引批处理请求时,有人知道主体内部的正确格式是什么吗?
预先感谢!
答案 0 :(得分:3)
分批处理不能避免配额限制
我可以按照索引API文档向Google发送单个页面更新请求。但是由于Google的配额有限,每天最多只能有200个请求,因此我需要更新的URL还要更多。因此,我正在尝试使用Google索引批处理请求,该请求最多可以将100个单独的请求分组,并且算作1个请求。
batching中没有任何内容表明它仅算作您的配额中的一项。
虽然批处理可以节省您构造许多HTTP请求的开销,但批处理请求中的每个Google API请求都将计入您的每日项目配额。默认情况下,一个项目每天最多可以提出200个请求;批量处理不会帮助您保持在此配额以下。
申请更高的配额
您是否考虑过申请更高的配额?我知道可能需要一些时间才能获得答复,但是您可能只想等待,看看他们怎么说。
请注意google-apis-nodejs-client
该库不支持批处理,因此您必须像当前#1130
那样自己做您的实际问题
让我知道您是否要继续尝试进行批处理工作。我会看看是否可以帮忙。带有手动版本。
答案 1 :(得分:1)
@DalmTo表示配额仍然适用,即使是批处理请求也是如此。但是您也没有正确构造有效负载,下面的示例有效。
const items = batch
.filter(x => x)
.map(line => {
return {
'Content-Type': 'application/http',
'Content-ID': batchId,
body:
'POST /v3/urlNotifications:publish HTTP/1.1\n' +
'Content-Type: application/json\n\n' +
JSON.stringify({
url: line,
type: 'URL_UPDATED',
}),
};
});
const options = {
url: 'https://indexing.googleapis.com/batch',
method: 'POST',
headers: {
'Content-Type': 'multipart/mixed',
},
auth: { bearer: access_token },
multipart: items,
};
request(options, (err, resp, body) => {
//...
});