文档管理中心

您当前正在浏览HarmonyOS最新文档,覆盖已发布的所有API版本,可在API参考中筛选您使用的API版本。详细的版本配套关系请参考版本说明。

指南与API参考API参考应用框架ArkWeb(方舟Web)ArkTS API@ohos.web.webview (Webview)Class (WebHttpBodyStream)

Class (WebHttpBodyStream)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

WebHttpBodyStream是HTTP请求体数据流对象,用于在自定义scheme拦截场景中读取POST、PUT等请求的请求体数据。该对象通过WebSchemeHandlerRequest的getHttpBodyStream方法获取,支持BYTES、FILE、BLOB、CHUNKED类型的数据。开发者可以通过该接口在自定义协议拦截器中读取上行数据,实现对请求体的检视或转发。注意本类中的其他接口需要在initialize成功后才能调用。

WebHttpBodyStream与WebSchemeHandlerRequest配合使用:WebSchemeHandlerRequest代表被拦截的请求,WebHttpBodyStream代表该请求的HTTP body数据流。通过读取流中的数据,开发者可以获取完整的请求体内容。

说明
  • 本模块首批接口从API version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

  • 本Class首批接口从API version 12开始支持。

  • 示例效果请以真机运行为准。

导入模块

收起
自动换行
深色代码主题
复制
  1. import { webview } from '@kit.ArkWeb';

initialize12+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

initialize(): Promise<void>

初始化WebHttpBodyStream。

系统能力: SystemCapability.Web.Webview.Core

返回值:

展开
类型 说明
Promise<void> Promise实例,用于获取WebHttpBodyStream是否初始化成功。

错误码:

以下错误码的详细介绍请参见Webview错误码。

展开
错误码ID 错误信息
17100022 Failed to initialize the HTTP body stream.

示例:

收起
自动换行
深色代码主题
复制
  1. // xxx.ets
  2. import { webview } from '@kit.ArkWeb';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. import { buffer } from '@kit.ArkTS';
  5. @Entry
  6. @Component
  7. struct WebComponent {
  8. controller: webview.WebviewController = new webview.WebviewController();
  9. schemeHandler: webview.WebSchemeHandler = new webview.WebSchemeHandler();
  10. htmlData: string = "<html><body bgcolor=\"white\">Source:<pre>source</pre></body></html>";
  11. build() {
  12. Column() {
  13. Button('postUrl')
  14. .onClick(() => {
  15. try {
  16. let postData = buffer.from(this.htmlData);
  17. this.controller.postUrl('https://www.example.com', postData.buffer);
  18. } catch (error) {
  19. console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`);
  20. }
  21. })
  22. Web({ src: 'https://www.example.com', controller: this.controller })
  23. .onControllerAttached(() => {
  24. try {
  25. this.schemeHandler.onRequestStart((request: webview.WebSchemeHandlerRequest, resourceHandler: webview.WebResourceHandler) => {
  26. console.info("[schemeHandler] onRequestStart");
  27. try {
  28. let stream = request.getHttpBodyStream();
  29. if (stream) {
  30. stream.initialize().then(() => {
  31. if (!stream) {
  32. return;
  33. }
  34. console.info("[schemeHandler] onRequestStart postDataStream size:" + stream.getSize());
  35. console.info("[schemeHandler] onRequestStart postDataStream position:" + stream.getPosition());
  36. console.info("[schemeHandler] onRequestStart postDataStream isChunked:" + stream.isChunked());
  37. console.info("[schemeHandler] onRequestStart postDataStream isEof:" + stream.isEof());
  38. console.info("[schemeHandler] onRequestStart postDataStream isInMemory:" + stream.isInMemory());
  39. stream.read(stream.getSize()).then((buffer) => {
  40. if (!stream) {
  41. return;
  42. }
  43. console.info("[schemeHandler] onRequestStart postDataStream readlength:" + buffer.byteLength);
  44. console.info("[schemeHandler] onRequestStart postDataStream isEof:" + stream.isEof());
  45. console.info("[schemeHandler] onRequestStart postDataStream position:" + stream.getPosition());
  46. }).catch((error: BusinessError) => {
  47. console.error(`ErrorCode: ${error.code}, Message: ${error.message}`);
  48. })
  49. }).catch((error: BusinessError) => {
  50. console.error(`ErrorCode: ${error.code}, Message: ${error.message}`);
  51. })
  52. } else {
  53. console.info("[schemeHandler] onRequestStart has no http body stream");
  54. }
  55. } catch (error) {
  56. console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`);
  57. }
  58. return false;
  59. })
  60. this.schemeHandler.onRequestStop((request: webview.WebSchemeHandlerRequest) => {
  61. console.info("[schemeHandler] onRequestStop");
  62. });
  63. this.controller.setWebSchemeHandler('https', this.schemeHandler);
  64. } catch (error) {
  65. console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`);
  66. }
  67. })
  68. .javaScriptAccess(true)
  69. .domStorageAccess(true)
  70. }
  71. }
  72. }

read12+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

read(size: number): Promise<ArrayBuffer>

读取WebHttpBodyStream中的数据。

系统能力: SystemCapability.Web.Webview.Core

参数:

展开
参数名 类型 必填 说明
size number 是 读取WebHttpBodyStream中的字节数。单位:字节。

返回值:

展开
类型 说明
Promise<ArrayBuffer> Promise实例,用于获取WebHttpBodyStream中读取的数据。

错误码:

以下错误码的详细介绍请参见通用错误码。

展开
错误码ID 错误信息
401 Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed.

示例:

完整示例代码参考initialize。

getSize12+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

getSize(): number

获取WebHttpBodyStream中的数据大小,分块传输时总是返回零。

系统能力: SystemCapability.Web.Webview.Core

返回值:

展开
类型 说明
number 获取WebHttpBodyStream数据大小。单位:字节。

示例:

完整示例代码参考initialize。

getPosition12+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

getPosition(): number

读取WebHttpBodyStream中当前的读取位置。

系统能力: SystemCapability.Web.Webview.Core

返回值:

展开
类型 说明
number WebHttpBodyStream中当前的读取位置。单位:字节。

示例:

完整示例代码参考initialize。

isChunked12+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

isChunked(): boolean

WebHttpBodyStream是否采用分块传输。

系统能力: SystemCapability.Web.Webview.Core

返回值:

展开
类型 说明
boolean WebHttpBodyStream是否采用分块传输,如果采用分块传输则返回true,否则返回false。

示例:

完整示例代码参考initialize。

isEof12+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

isEof(): boolean

判断WebHttpBodyStream中的所有数据是否都已被读取。

系统能力: SystemCapability.Web.Webview.Core

返回值:

展开
类型 说明
boolean

WebHttpBodyStream中的所有数据是否都已被读取。

如果所有数据都已被读取,则返回true。对于分块传输类型的WebHttpBodyStream,在第一次读取尝试之前返回false。

示例:

完整示例代码参考initialize。

isInMemory12+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

isInMemory(): boolean

判断WebHttpBodyStream中的上传数据是否在内存中。

系统能力: SystemCapability.Web.Webview.Core

返回值:

展开
类型 说明
boolean

WebHttpBodyStream中的上传数据是否在内存中。

如果WebHttpBodyStream中的上传数据完全在内存中,并且所有读取请求都将同步成功,则返回true。对于分块传输类型的数据,预期返回false。

示例:

完整示例代码参考initialize。