JS使用HTTP获取批处理数据

时间:2017-04-03 23:30:25

标签: javascript http google-chrome-devtools fetch-api

我的RESTful服务允许batching requests

我正在尝试在Fetch API的帮助下将请求合并到一个批处理中:

let req1 = {
        url: "/cups/count",
        options: {
           method: 'GET',
           headers: {
               'Content-Type': 'application/http'
           }
       }
    },

    req2 = {
        url: "/spoons/count",
        options: {
           method: 'GET',
           headers: {
               'Content-Type': 'application/http'
           }
        }
    },
    authToken = "Bearer my_token123",
    batchUrl = "http://something.com/batch",
    options = {
        method: 'POST',
        headers: {
            'Authorization': authToken,
            'Content-Type': 'multipart/mixed'
        },
        body: {req1, req2}
    };

    return fetch(batchUrl, options)
        .then(response => response.json())
        .then(items => dispatch(batchSuccess(items)))
        .catch((err) => {
            console.log(err)
        });

然而它返回错误 - 错误的请求。我想我可能会以错误的方式组合HTTP请求。

有更简单的方法吗?

我可以在网络Chrome开发工具中看到嵌套的HTTP请求吗?

2 个答案:

答案 0 :(得分:2)

您的代码无效,因为它不遵循multipart/mixed请求格式:

  1. Content-Type标题中,没有边界信息。
  2. 子请求不按边界划分,而是以req1&的纯文本形式发送。 req2对象。
  3. 为了发送有效的multipart/mixed请求,有一个node.js模块batchelor。根据介绍页面,它的用法非常简单。

    如果您想从浏览器发送multipart/mixed请求,您可以使用构建工具(gulp,webpack等)将batchelor编译为类似" batchelor-compiled.js"并以HTML格式导入。

    对于开发者工具,我在Chrome中找不到任何内容,但在Firefox调试窗口中可以看到子请求" Params"标签

    enter image description here

答案 1 :(得分:2)

以下是将Fetch APIGmail Batch REST API结合使用的批处理请求的示例。

这将同时获取多条消息的内容。

const response = await fetch("https://www.googleapis.com/batch/gmail/v1", {
  headers: {
    "Content-Type": "multipart/mixed; boundary=batch_boundary",
    Authorization: "Bearer <access_token>",
  },
  method: "POST",
  body: `--batch_boundary
Content-Type: application/http
Content-ID: 1

GET /gmail/v1/users/me/messages/{message-id-1}

--batch_boundary
Content-Type: application/http
Content-ID: 2

GET /gmail/v1/users/me/messages/{message-id-2}

--batch_boundary--`,
});

console.log(await response.text());