0

我正在研究一种将报告日志发送到报告门户并附有屏幕截图的方法。我正在使用 XmlHttpRequest 模块来访问报告门户日志端点。这是我的代码。但是此代码不起作用,而是收到“json_request_part is missing”响应消息。我做错了什么,我按照这里的文档 docs

  try {
    const request = new XMLHttpRequest();

    const body = {
    itemUuid: 'gsgasgh-dsjdbbdjsbd',
    launchUuid: 'hshu1qqqqjjhdh-ddjdh',
    time: '1555677888',
    message: 'failed',
    level: 40000,
    file: {
      name: 'screenshot.png',
    },

  };

    request.open('POST', `http://rp.com/my_project/log`, false); // `false` makes the request synchronous
    request.setRequestHeader('Content-Type', 'multipart/form-data');
    request.setRequestHeader('Authorization', `Bearer ${config.token}`);
    request.send(JSON.stringify(body));

    if (request.status >= 200 && request.status <= 299) {
      const { responseText } = request;
      console.log(responseText);
    } else {
      console.log(`Unexpected Response Returned: ${request.responseText}`);
    }
  } catch (error) {
    console.log(error.message);
  }
};
4

1 回答 1

1

发送二进制数据有点复杂,你必须以特殊格式形成你的多部分请求。本指南中对格式进行了很好的描述。请注意,您的请求的第一部分应包含 JSON 以及来自 multipart 其他部分的日志消息和文件名。此外,已经有ReportPortal 团队维护的Javascript 实现。您可能还会发现此剪辑很有帮助:

    buildMultiPartStream(jsonPart, filePart, boundary) {
    const eol = "\r\n";
    const bx = `--${boundary}`;
    const buffers = [
        // eslint-disable-next-line function-paren-newline
        Buffer.from(
            // eslint-disable-next-line prefer-template
            bx + eol + "Content-Disposition: form-data; name=\"json_request_part\""
            + eol + "Content-Type: application/json" + eol
            + eol + eol + JSON.stringify(jsonPart) + eol,
        ),
        // eslint-disable-next-line function-paren-newline
        Buffer.from(
            // eslint-disable-next-line prefer-template
            bx + eol + "Content-Disposition: form-data; name=\"file\"; filename=\"" + filePart.name + "\"" + eol
            + "Content-Type: " + filePart.type + eol + eol,
        ),
        Buffer.from(filePart.content, 'base64'),
        Buffer.from(`${eol + bx}--${eol}`),
    ];
    return Buffer.concat(buffers);
}
于 2021-05-17T12:37:25.387 回答