Как отправить многочастный / смешанный запрос на пакетный запрос индексации Google в NodeJs?
Я использую Nodejs для подключения к GoogleApis v35.0.0, чтобы сообщить Google об обновлении или удалении страниц из индекса Google. И я застрял в запросе multipart/mixed, теле multipart, когда отправляю запрос через пакетный запрос индексации Google.
Я мог бы отправить отдельный запрос на обновление страницы в Google, следуя документации по API индексации. Но так как Google имеет ограниченную квоту максимум в 200 запросов в день, и мне нужно обновить больше URL, чем это. Итак, я пытаюсь использовать пакетный запрос индексации Google, который может группировать до 100 отдельных запросов, и это считается как 1 запрос.
У меня проблема с правильным форматом составного тела, когда я пытаюсь отправить запрос партиями. Я использую JWT (JSON Web Token) GoogleApis, который расширился от oauth2 для аутентификации моей учетной записи, и использую библиотеку запросов v2.88.0 для отправки запроса в Google.
Поскольку библиотека запросов уже обрабатывает многокомпонентную границу, поэтому я не отправляю ее как одну из опций запроса. Я также проверяю информацию в multipart/mixed библиотеки npm запросов, но я нашел только одну похожую, но не ту же, что и multipart / related ( https://github.com/request/request).
В соответствии с примером тела пакетного запроса от 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. Похоже, что все внутри тела multipart считают заголовками. Но согласно документации формат пакетного запроса, он говорит, что "Каждая часть начинается со своего собственного HTTP-заголовка Content-Type: application / 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"
}
}
Кто-нибудь знает, какой правильный формат тела внутри multipart, когда он запрашивает пакетный запрос индексации Google?
Спасибо заранее!
2 ответа
Как говорит @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) => {
//...
});
Пакетирование не помогает избежать ограничения квоты
Я мог бы отправить отдельный запрос на обновление страницы в Google, следуя документации по API индексации. Но так как Google имеет ограниченную квоту максимум в 200 запросов в день, и мне нужно обновить больше URL, чем это. Итак, я пытаюсь использовать пакетный запрос индексации Google, который может группировать до 100 отдельных запросов, и это считается как 1 запрос.
В пакетном режиме нет ничего, что бы указывало на единицу в отношении вашей квоты.
Несмотря на то, что пакетная обработка позволяет сэкономить на накладных расходах на создание множества HTTP-запросов, каждый запрос API Google в пакетном запросе будет учитываться в вашей ежедневной квоте проекта. По умолчанию проект может выполнять до 200 запросов в день; дозировка не поможет вам остаться ниже этой квоты.
Подать заявку на более высокую квоту
Рассматривали ли вы заявку на повышение квоты? Я знаю, что может потребоваться время, чтобы получить ответ, но вы можете просто подождать и посмотреть, что они скажут.
Примечание google-apis-nodejs-client
Библиотека не поддерживает пакетирование, поэтому вам придется сделать это самостоятельно, так как вы в настоящее время #1130
Ваш актуальный вопрос
Дайте мне знать, если вы хотите продолжить попытки заставить пакетную работу работать. Я посмотрю, смогу ли я помочь. С ручной версией.