1# Class (WebHttpBodyStream) 2<!--Kit: ArkWeb--> 3<!--Subsystem: Web--> 4<!--Owner: @aohui--> 5<!--Designer: @yaomingliu--> 6<!--Tester: @ghiker--> 7<!--Adviser: @HelloCrease--> 8 9POST、PUT请求的数据体,支持BYTES、FILE、BLOB、CHUNKED类型的数据。注意本类中其他接口需要在[initialize](#initialize12)成功后才能调用。 10 11> **说明:** 12> 13> - 本模块首批接口从API version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 14> 15> - 本Class首批接口从API version 12开始支持。 16> 17> - 示例效果请以真机运行为准,当前DevEco Studio预览器不支持。 18 19## 导入模块 20 21```ts 22import { webview } from '@kit.ArkWeb'; 23``` 24 25## initialize<sup>12+</sup> 26 27initialize(): Promise\<void\> 28 29初始化WebHttpBodyStream。 30 31**系统能力:** SystemCapability.Web.Webview.Core 32 33**返回值:** 34 35| 类型 | 说明 | 36| ------ | ------------------------- | 37| Promise\<void\> | Promise实例,用于获取WebHttpBodyStream是否初始化成功。 | 38 39**错误码:** 40 41以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 42 43| 错误码ID | 错误信息 | 44| -------- | ------------------------------------- | 45| 17100022 | Failed to initialize the HTTP body stream. | 46 47**示例:** 48 49```ts 50// xxx.ets 51import { webview } from '@kit.ArkWeb'; 52import { BusinessError } from '@kit.BasicServicesKit'; 53import { buffer } from '@kit.ArkTS'; 54import { WebNetErrorList } from '@ohos.web.netErrorList' 55 56@Entry 57@Component 58struct WebComponent { 59 controller: webview.WebviewController = new webview.WebviewController(); 60 schemeHandler: webview.WebSchemeHandler = new webview.WebSchemeHandler(); 61 htmlData: string = "<html><body bgcolor=\"white\">Source:<pre>source</pre></body></html>"; 62 63 build() { 64 Column() { 65 Button('postUrl') 66 .onClick(() => { 67 try { 68 let postData = buffer.from(this.htmlData); 69 this.controller.postUrl('https://www.example.com', postData.buffer); 70 } catch (error) { 71 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 72 } 73 }) 74 Web({ src: 'https://www.example.com', controller: this.controller }) 75 .onControllerAttached(() => { 76 try { 77 this.schemeHandler.onRequestStart((request: webview.WebSchemeHandlerRequest, resourceHandler: webview.WebResourceHandler) => { 78 console.info("[schemeHandler] onRequestStart"); 79 try { 80 let stream = request.getHttpBodyStream(); 81 if (stream) { 82 stream.initialize().then(() => { 83 if (!stream) { 84 return; 85 } 86 console.info("[schemeHandler] onRequestStart postDataStream size:" + stream.getSize()); 87 console.info("[schemeHandler] onRequestStart postDataStream position:" + stream.getPosition()); 88 console.info("[schemeHandler] onRequestStart postDataStream isChunked:" + stream.isChunked()); 89 console.info("[schemeHandler] onRequestStart postDataStream isEof:" + stream.isEof()); 90 console.info("[schemeHandler] onRequestStart postDataStream isInMemory:" + stream.isInMemory()); 91 stream.read(stream.getSize()).then((buffer) => { 92 if (!stream) { 93 return; 94 } 95 console.info("[schemeHandler] onRequestStart postDataStream readlength:" + buffer.byteLength); 96 console.info("[schemeHandler] onRequestStart postDataStream isEof:" + stream.isEof()); 97 console.info("[schemeHandler] onRequestStart postDataStream position:" + stream.getPosition()); 98 }).catch((error: BusinessError) => { 99 console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); 100 }) 101 }).catch((error: BusinessError) => { 102 console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); 103 }) 104 } else { 105 console.info("[schemeHandler] onRequestStart has no http body stream"); 106 } 107 } catch (error) { 108 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 109 } 110 111 return false; 112 }) 113 114 this.schemeHandler.onRequestStop((request: webview.WebSchemeHandlerRequest) => { 115 console.info("[schemeHandler] onRequestStop"); 116 }); 117 118 this.controller.setWebSchemeHandler('https', this.schemeHandler); 119 } catch (error) { 120 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 121 } 122 }) 123 .javaScriptAccess(true) 124 .domStorageAccess(true) 125 } 126 } 127} 128 129``` 130 131## read<sup>12+</sup> 132 133read(size: number): Promise\<ArrayBuffer\> 134 135读取WebHttpBodyStream中的数据。 136 137**系统能力:** SystemCapability.Web.Webview.Core 138 139**参数:** 140 141| 参数名 | 类型 | 必填 | 说明 | 142| --------| ------- | ---- | ---------------------------| 143| size | number | 是 | 读取WebHttpBodyStream中的字节数。 | 144 145**返回值:** 146 147| 类型 | 说明 | 148| ------ | ------------------------- | 149| Promise\<ArrayBuffer\> | Promise实例,用于获取WebHttpBodyStream中读取的数据。 | 150 151**错误码:** 152 153以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 154 155| 错误码ID | 错误信息 | 156| -------- | ------------------------------------- | 157| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 158 159**示例:** 160 161完整示例代码参考[initialize](#initialize12)。 162 163## getSize<sup>12+</sup> 164 165getSize(): number 166 167获取WebHttpBodyStream中的数据大小,分块传输时总是返回零。 168 169**系统能力:** SystemCapability.Web.Webview.Core 170 171**返回值:** 172 173| 类型 | 说明 | 174| ------ | ------------------------- | 175| number | 获取WebHttpBodyStream中的数据大小。 | 176 177**示例:** 178 179完整示例代码参考[initialize](#initialize12)。 180 181## getPosition<sup>12+</sup> 182 183getPosition(): number 184 185读取WebHttpBodyStream中当前的读取位置。 186 187**系统能力:** SystemCapability.Web.Webview.Core 188 189**返回值:** 190 191| 类型 | 说明 | 192| ------ | ------------------------- | 193| number | WebHttpBodyStream中当前的读取位置。 | 194 195**示例:** 196 197完整示例代码参考[initialize](#initialize12)。 198 199## isChunked<sup>12+</sup> 200 201isChunked(): boolean 202 203WebHttpBodyStream是否采用分块传输。 204 205**系统能力:** SystemCapability.Web.Webview.Core 206 207**返回值:** 208 209| 类型 | 说明 | 210| ------ | ------------------------- | 211| boolean | WebHttpBodyStream是否采用分块传输,如果采用分块传输则返回true,否则返回false。 | 212 213**示例:** 214 215完整示例代码参考[initialize](#initialize12)。 216 217## isEof<sup>12+</sup> 218 219isEof(): boolean 220 221判断WebHttpBodyStream中的所有数据是否都已被读取。 222 223**系统能力:** SystemCapability.Web.Webview.Core 224 225**返回值:** 226 227| 类型 | 说明 | 228| ------ | ------------------------- | 229| boolean | WebHttpBodyStream中的所有数据是否都已被读取。<br>如果所有数据都已被读取,则返回true。对于分块传输类型的WebHttpBodyStream,在第一次读取尝试之前返回false。 | 230 231**示例:** 232 233完整示例代码参考[initialize](#initialize12)。 234 235## isInMemory<sup>12+</sup> 236 237isInMemory(): boolean 238 239判断WebHttpBodyStream中的上传数据是否在内存中。 240 241**系统能力:** SystemCapability.Web.Webview.Core 242 243**返回值:** 244 245| 类型 | 说明 | 246| ------ | ------------------------- | 247| boolean | WebHttpBodyStream中的上传数据是否在内存中。<br>如果WebHttpBodyStream中的上传数据完全在内存中,并且所有读取请求都将同步成功,则返回true。对于分块传输类型的数据,预期返回false。 | 248 249**示例:** 250 251完整示例代码参考[initialize](#initialize12)。