我使用Nodejs与GoogleApis v35.0.0连接,告诉谷歌更新或删除谷歌索引中的页面。当我通过Google索引批处理请求发送请求时,我陷入了多部分/混合请求,也就是多部分请求的主体。
我可以发送一个单独的页面更新请求到谷歌,通过遵循索引API文档。但是,由于谷歌的限额是每天最多200个请求,所以我需要更新更多的URL。因此,我试图使用谷歌索引批处理请求,它可以分组最多100个单独的请求,它可以算作一个请求。
当我试图通过批处理发送请求时,我对多部分主体的正确格式有问题。我正在使用GoogleApis的JWT (JSON ),它从oauth2扩展来验证我的帐户,并使用请求库v2.88.0向谷歌发送请求。
由于请求库已经处理了多部分边界,所以我不会将其作为请求选项之一发送。我还检查了请求npm库中的多部分/混合信息,但我只发现一个类似的,但不相同的信息,即多部分/相关(https://github.com/request/request#multipartrelated)。
根据来自谷歌的批处理请求体示例,我需要在主请求中使用multipart/ main作为内容类型:
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);
});
});我在多个部分的正文中出现错误,我不知道google索引批处理请求是什么类型的。似乎多个部分体内的所有东西都在考虑作为标题。但是根据批处理请求格式的文档,它说“每个部分都以自己的内容开始--Type:application/ header。每个部分的主体本身就是一个完整的HTTP请求,具有自己的动词、URL、标头和正文”。有关更多详细信息,请查看:api/v1/how/批处理。
但是,当我执行我的代码时,我会得到以下错误:
{
"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索引批处理请求时,主体内部的哪种格式是正确的?
谢谢你的提前!
发布于 2019-02-06 16:15:07
正如@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) => {
//...
});发布于 2019-01-25 11:18:33
批处理无助于避免配额限制
我可以通过遵循索引API文档向Google发送一个单独的页面更新请求。但是,由于谷歌的限额是每天最多200个请求,所以我需要更新更多的URL。因此,我试图使用谷歌索引批处理请求,它可以分组最多100个单独的请求,它可以算作一个请求。
在分批中,没有任何东西表明它只作为一个与您的配额相对应的。
虽然批处理可以节省构建许多HTTP请求的开销,但在批处理请求中的每个Google请求都将从您的日常项目配额中计算在内。默认情况下,项目每天最多可以满足200个请求;批处理不会帮助您保持在此限额以下。
申请更高的配额
你考虑过申请更高的配额吗?我知道得到回复可能需要时间,但你可能只想等着看他们说些什么。

备注谷歌-apis nodejs-客户端
库不支持批处理,所以您必须自己完成,因为您现在是#1130。
您的实际问题
如果你想继续努力工作的话,请告诉我。我看看能不能帮上忙。用手动版本。
https://stackoverflow.com/questions/54337324
复制相似问题