Как отправить многочастный / смешанный запрос на пакетный запрос индексации Google в NodeJs? - PullRequest
0 голосов
/ 24 января 2019

Я использую Nodejs для соединения с GoogleApis v35.0.0 , чтобы сообщить Google об обновлении или удалении страниц из индекса Google.И я застрял в многочастном / смешанном запросе, теле 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#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. Похоже, что все внутри тела 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 ]

0 голосов
/ 06 февраля 2019

Как говорит @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) => {
  //...
});
0 голосов
/ 25 января 2019

Пакетная обработка не помогает избежать ограничений квоты

Я мог отправить отдельный запрос на обновление страницы в Google, следуя документации API индексации.Но так как Google имеет ограниченную квоту максимум в 200 запросов в день, и мне нужно обновить больше URL, чем это.Итак, я пытаюсь использовать пакетный запрос индексации Google, который может группировать не более 100 отдельных запросов, и он считается как 1 запрос.только считается за единицу против вашей квоты.

Несмотря на то, что пакетная обработка позволяет сэкономить на накладных расходах на создание многих HTTP-запросов, каждый запрос API Google в пакетном запросе будет учитываться в вашей ежедневной квоте проекта.По умолчанию проект может выполнять до 200 запросов в день;пакетирование не поможет вам остаться ниже этой квоты.

Подать заявку на более высокую квоту

Рассматривали ли вы возможность подать заявку на более высокую квоту?Я знаю, что может потребоваться время, чтобы получить ответ, но вы можете просто подождать и посмотреть, что они говорят.

enter image description here

Примечаниеgoogle-apis-nodejs-client

Библиотека не поддерживает пакетную обработку, поэтому вам придется делать это самостоятельно, поскольку вы в настоящее время # 1130

Ваш фактический вопрос

Дайте мне знать, если вы хотите продолжить попытки заставить пакетную работу работать.Я посмотрю, смогу ли я помочь.С ручной версией.

...