5

我正在使用 Nodejs 与GoogleApis v35.0.0连接,以告诉 Google 从 Google 索引中更新或删除页面。当我通过Google indexing batch request发送请求时,我陷入了 multipart/mixed 请求,即 multipart 的主体。

我可以按照索引 API 文档向 Google 发送单个页面更新请求。但由于 Google 的配额有限,每天最多 200 个请求,我需要更新更多的 URL。所以,我正在尝试使用谷歌索引批处理请求,它最多可以分组 100 个单独的请求,它算作 1 个请求。

当我尝试批量发送请求时,我遇到了多部分正文的正确格式问题。我正在使用从 oauth2 扩展的 GoogleApis 的 JWT(JSON Web 令牌)来验证我的帐户,并使用请求库 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);
      });

    });

我在多部分的正文中遇到错误,我不知道正在等待哪种正文 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"
  }
}

当它请求谷歌索引批处理请求时,有人知道多部分内的正确格式是什么吗?

在此先感谢!

4

2 回答 2

4

批处理无助于避免配额限制

我可以按照索引 API 文档向 Google 发送单个页面更新请求。但由于 Google 的配额有限,每天最多 200 个请求,我需要更新更多的 URL。所以,我正在尝试使用谷歌索引批处理请求,它最多可以分组 100 个单独的请求,它算作 1 个请求。

批处理中没有任何内容表明它只计入您的配额。

虽然批处理可以为您节省构建许多 HTTP 请求的开销,但批处理请求中的每个 Google API 请求都将计入您的每日项目配额。默认情况下,一个项目每天最多可以提出 200 个请求;批处理不会帮助您保持低于此配额。

申请更高的配额

你有没有考虑申请更高的配额?我知道回复回复可能需要一些时间,但您可能只想等着看他们怎么说。

在此处输入图像描述

注意 google-apis-nodejs-client

该库不支持批处理,因此您必须像现在一样自己做#1130

您的实际问题

如果您想继续尝试使批处理工作,请告诉我。我会看看我能不能帮忙。带手动版。

于 2019-01-25T11:18:33.390 回答
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) => {
  //...
});
于 2019-02-06T16:15:07.657 回答