首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NodeJs中为google索引批处理请求发送多部分/混合请求?

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

Stack Overflow用户
提问于 2019-01-23 23:35:54
回答 2查看 3.1K关注 0票数 5

我使用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作为内容类型:

代码语言:javascript
复制
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" }

这是我的密码:

代码语言:javascript
复制
    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/批处理

但是,当我执行我的代码时,我会得到以下错误:

代码语言:javascript
复制
{
  "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索引批处理请求时,主体内部的哪种格式是正确的?

谢谢你的提前!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-06 16:15:07

正如@DalmTo说的那样,配额仍然适用,甚至是批处理请求。但是,您也没有正确地构造有效负载,下面的示例可以使用。

代码语言:javascript
复制
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) => {
  //...
});
票数 3
EN

Stack Overflow用户

发布于 2019-01-25 11:18:33

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

我可以通过遵循索引API文档向Google发送一个单独的页面更新请求。但是,由于谷歌的限额是每天最多200个请求,所以我需要更新更多的URL。因此,我试图使用谷歌索引批处理请求,它可以分组最多100个单独的请求,它可以算作一个请求。

分批中,没有任何东西表明它只作为一个与您的配额相对应的。

虽然批处理可以节省构建许多HTTP请求的开销,但在批处理请求中的每个Google请求都将从您的日常项目配额中计算在内。默认情况下,项目每天最多可以满足200个请求;批处理不会帮助您保持在此限额以下。

申请更高的配额

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

备注谷歌-apis nodejs-客户端

库不支持批处理,所以您必须自己完成,因为您现在是#1130

您的实际问题

如果你想继续努力工作的话,请告诉我。我看看能不能帮上忙。用手动版本。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54337324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档