当前位置: 首页 > 知识库问答 >
问题:

如何在NodeJs中为google索引批处理请求发送多部分/混合请求?

朱刚捷
2023-03-14

我正在使用Nodejs连接GoogleApis v35。0.0告诉Google更新或删除Google索引中的页面。当我通过Google索引批处理请求发送请求时,我陷入了多部分/混合请求,多部分的主体。

通过遵循索引API文档,我可以向Google发送一个单独的页面更新请求。但是由于谷歌每天最多有200个请求,所以我需要更新更多的URL。所以,我尝试使用谷歌索引批量请求,它最多可以对100个单独的请求进行分组,并计算为1个请求。

当我试图批量发送请求时,我对多部分主体的正确格式有问题。我使用的是Google Apis的JWT(JSON Web Token),它从oAuth2扩展来验证我的帐户,并使用请求库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);
      });

    });

我得到了错误的身体的多部分,我不知道哪种身体谷歌索引批处理请求正在等待。看起来像是多部分身体内部的一切都被认为是头部。但是根据批处理请求的留档格式,它说“每个部分都以其自己的内容类型:应用程序/超文本传输协议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索引批处理请求时,multipart中的body的正确格式是什么吗?

提前谢谢!

共有2个答案

盖高畅
2023-03-14

正如@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) => {
  //...
});
程谦
2023-03-14

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

通过遵循索引API文档,我可以向Google发送一个单独的页面更新请求。但是由于谷歌每天最多有200个请求,所以我需要更新更多的URL。所以,我尝试使用谷歌索引批量请求,它最多可以对100个单独的请求进行分组,并计算为1个请求。

批处理中没有任何内容表明它只算作你配额中的一个。

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

申请更高的配额

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

注意GoogleAPIsNodeJS客户端

该库不支持批处理,因此您必须自己进行批处理,因为您目前是#1130

你的实际问题

让我知道,如果你想继续尝试得到批处理工作。我看看能不能帮上忙。带手动版本。

 类似资料:
  • 问题内容: 我有以下POST请求表格(简化): 我尝试发送POST请求: 但它返回状态并带有以下注释: 请指出我的错误。我应该进行哪些更改才能使其正常工作? 问题答案: 您自己设置标题,包括边界。不要这样 会为您生成一个边界并将其设置在标头中,但是如果您 已经 设置了标头,那么生成的有效负载和标头将不匹配。只需将标题全部放下即可: 请注意,我还给了零件一个文件名(路径的基本名称)。 有关多部分PO

  • 我正在开发基于Spring 3.2的RESTful服务。我遇到了一个控制器处理混合多部分HTTP请求的问题,第二部分是XML或JSON格式的数据,第二部分是图像文件。 我正在使用@Request estPart注释来接收请求 User.java会这样- 据我所知,使用@RequestPart注释,我希望根据XML多部分部分的内容类型对其进行评估,并最终将其解编组到我的用户类中(我使用的是Jaxb2

  • 我是vapor的初学者,我选择vapor 3-rc作为开始,因为它似乎打破了vapor 2的变化。不幸的是,目前还没有完整的文档。 我目前正在尝试将一个简单的txt文件从Postman上传到我的Vapor 3本地服务器。 这是我的路线 和我的控制器 首先,通过执行邮递员请求,服务器返回: 通过研究源代码和关于此的有限文档,我似乎应该声明一个解码器来支持多部分传入请求。 所以我做到了: 我使用For

  • 我使用的是ApacheHttpComponentsV4.3.3(maven httpclient和httpmime)。我需要上传一个带有元数据的文件。工作的curl命令如下所示。 curl-k-i-h“content-type:multipart/mixed”-x post--form'field1=val1'--form'field2=val2'--form'file=@somefile.zip

  • 问题内容: 我想知道如何以n为一组进行ajax调用。 这是我的用例: 我有一个显示使用情况数据的表。您可以钻取每一行,如果每行都有一个可以更深入钻取的公共属性,则可以选择一次钻取所有它们。对于每一行,都会进行ajax调用以获取要附加到表中的数据。 在某些情况下,最多可以同时钻取50行。可以想象,这给服务器带来了很大压力。我如何最好地以较小的批次发送这些呼叫,这些呼叫在等待这些批次之后才能启动? 我

  • 我需要向我的Spring控制器发送一个带有json的文件。我有以下控制器类: 但当我在服务器上使用以下命令时: 我得到415不支持的媒体类型! 有线索吗?