1# Class (WebResourceHandler) 2<!--Kit: ArkWeb--> 3<!--Subsystem: Web--> 4<!--Owner: @aohui--> 5<!--Designer: @yaomingliu--> 6<!--Tester: @ghiker--> 7<!--Adviser: @HelloCrease--> 8 9通过WebResourceHandler,可以提供自定义的返回头以及返回体给Web组件。 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## didReceiveResponse<sup>12+</sup> 26 27didReceiveResponse(response: WebSchemeHandlerResponse): void 28 29将构造的响应头传递给被拦截的请求。 30 31**系统能力:** SystemCapability.Web.Webview.Core 32 33**参数:** 34 35| 参数名 | 类型 | 必填 | 说明 | 36| ---------------| ------- | ---- | ------------- | 37| response | [WebSchemeHandlerResponse](./arkts-apis-webview-WebSchemeHandlerResponse.md) | 是 | 该拦截请求的响应。 | 38 39**错误码:** 40 41以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 42 43| 错误码ID | 错误信息 | 44| -------- | ------------------------------------- | 45| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. | 46| 17100021 | The resource handler is invalid. | 47 48**示例:** 49 50示例请参考[OnRequestStart](./arkts-apis-webview-WebSchemeHandler.md#onrequeststart12)。 51 52## didReceiveResponseBody<sup>12+</sup> 53 54didReceiveResponseBody(data: ArrayBuffer): void 55 56将构造的响应体传递给被拦截的请求。 57 58**系统能力:** SystemCapability.Web.Webview.Core 59 60**参数:** 61 62| 参数名 | 类型 | 必填 | 说明 | 63| ---------------| ------- | ---- | ------------- | 64| data | ArrayBuffer | 是 | 响应体数据。 | 65 66**错误码:** 67 68以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 69 70| 错误码ID | 错误信息 | 71| -------- | ------------------------------------- | 72| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. | 73| 17100021 | The resource handler is invalid. | 74 75**示例:** 76 77示例请参考[OnRequestStart](./arkts-apis-webview-WebSchemeHandler.md#onrequeststart12)。 78 79## didFinish<sup>12+</sup> 80 81didFinish(): void 82 83通知Web组件被拦截的请求已经完成,并且没有更多的数据可用,调用前需要优先调用[didReceiveResponse](#didreceiveresponse12)将构造的响应头传递给被拦截的请求。 84 85**系统能力:** SystemCapability.Web.Webview.Core 86 87**错误码:** 88 89以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 90 91| 错误码ID | 错误信息 | 92| -------- | ------------------------------------- | 93| 17100021 | The resource handler is invalid. | 94 95**示例:** 96 97示例请参考[OnRequestStart](./arkts-apis-webview-WebSchemeHandler.md#onrequeststart12)。 98 99## didFail<sup>12+</sup> 100 101didFail(code: WebNetErrorList): void 102 103通知ArkWeb内核被拦截请求应该返回失败,调用前需要优先调用[didReceiveResponse](#didreceiveresponse12)将构造的响应头传递给被拦截的请求。 104 105**系统能力:** SystemCapability.Web.Webview.Core 106 107**参数:** 108 109| 参数名 | 类型 | 必填 | 说明 | 110| --------| ------- | ---- | ---------------------------| 111| code | [WebNetErrorList](arkts-apis-netErrorList.md#webneterrorlist) | 是 | 网络错误码。 | 112 113**错误码:** 114 115以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 116 117| 错误码ID | 错误信息 | 118| -------- | ------------------------------------- | 119| 401 | Parameter error. Possible causes: 1. Incorrect parameter types. | 120| 17100021 | The resource handler is invalid. | 121 122 123**示例:** 124 125示例请参考[OnRequestStart](./arkts-apis-webview-WebSchemeHandler.md#onrequeststart12)。 126 127## didFail<sup>20+</sup> 128 129didFail(code: WebNetErrorList, completeIfNoResponse: boolean): void 130 131通知ArkWeb内核,被拦截请求应返回失败。若completeIfNoResponse为false,调用前需优先调用[didReceiveResponse](#didreceiveresponse12),将构造的响应头传递给被拦截的请求。若completeIfNoResponse为true,且调用前未调用[didReceiveResponse](#didreceiveresponse12),则自动生成一个响应头,网络错误码为-104,详情参见[WebNetErrorList](arkts-apis-netErrorList.md#webneterrorlist)。 132 133**系统能力:** SystemCapability.Web.Webview.Core 134 135**参数:** 136 137| 参数名 | 类型 | 必填 | 说明 | 138| --------| ------- | ---- | ---------------------------| 139| code | [WebNetErrorList](arkts-apis-netErrorList.md#webneterrorlist) | 是 | 网络错误码。 | 140| completeIfNoResponse | boolean | 是 | 调用当前接口时,若之前未调用过[didReceiveResponse](#didreceiveresponse12),是否完成此次网络请求;值为true时,若之前未调用过[didReceiveResponse](#didreceiveresponse12),则会自动生成一个response以完成此次网络请求,网络错误码为-104;值为false时,将等待应用调用[didReceiveResponse](#didreceiveresponse12)并传入response,不会直接完成此次网络请求。 | 141 142**错误码:** 143 144以下错误码的详细介绍请参见[Webview错误码](errorcode-webview.md)。 145 146| 错误码ID | 错误信息 | 147| -------- | ------------------------------------- | 148| 17100101 | The errorCode is either ARKWEB_NET_OK or outside the range of error codes in WebNetErrorList. | 149| 17100021 | The resource handler is invalid. | 150 151**示例:** 152 153```ts 154// xxx.ets 155import { webview, WebNetErrorList } from '@kit.ArkWeb'; 156import { BusinessError } from '@kit.BasicServicesKit'; 157 158@Entry 159@Component 160struct WebComponent { 161 controller: webview.WebviewController = new webview.WebviewController(); 162 schemeHandler: webview.WebSchemeHandler = new webview.WebSchemeHandler(); 163 164 build() { 165 Column() { 166 Web({ src: 'https://www.example.com', controller: this.controller }) 167 .onControllerAttached(() => { 168 try { 169 this.schemeHandler.onRequestStart((request: webview.WebSchemeHandlerRequest, resourceHandler: webview.WebResourceHandler) => { 170 console.info("[schemeHandler] onRequestStart"); 171 try { 172 console.info("[schemeHandler] onRequestStart url:" + request.getRequestUrl()); 173 console.info("[schemeHandler] onRequestStart method:" + request.getRequestMethod()); 174 console.info("[schemeHandler] onRequestStart referrer:" + request.getReferrer()); 175 console.info("[schemeHandler] onRequestStart isMainFrame:" + request.isMainFrame()); 176 console.info("[schemeHandler] onRequestStart hasGesture:" + request.hasGesture()); 177 console.info("[schemeHandler] onRequestStart header size:" + request.getHeader().length); 178 console.info("[schemeHandler] onRequestStart resource type:" + request.getRequestResourceType()); 179 console.info("[schemeHandler] onRequestStart frame url:" + request.getFrameUrl()); 180 let header = request.getHeader(); 181 for (let i = 0; i < header.length; i++) { 182 console.info("[schemeHandler] onRequestStart header:" + header[i].headerKey + " " + header[i].headerValue); 183 } 184 let stream = request.getHttpBodyStream(); 185 if (stream) { 186 console.info("[schemeHandler] onRequestStart has http body stream"); 187 } else { 188 console.info("[schemeHandler] onRequestStart has no http body stream"); 189 } 190 } catch (error) { 191 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 192 } 193 194 if (request.getRequestUrl().endsWith("example.com")) { 195 return false; 196 } 197 198 try { 199 // 直接调用didFail(WebNetErrorList.ERR_FAILED, true),自动构造一个网络请求错误ERR_CONNECTION_FAILED 200 resourceHandler.didFail(WebNetErrorList.ERR_FAILED, true); 201 } catch (error) { 202 // 当error.code为17100101时,若没有处理该错误,didFail方法也会调用成功。 203 console.error(`[schemeHandler] ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 204 } 205 return true; 206 }) 207 208 this.schemeHandler.onRequestStop((request: webview.WebSchemeHandlerRequest) => { 209 console.info("[schemeHandler] onRequestStop"); 210 }); 211 212 this.controller.setWebSchemeHandler('https', this.schemeHandler); 213 } catch (error) { 214 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 215 } 216 }) 217 .javaScriptAccess(true) 218 .domStorageAccess(true) 219 } 220 } 221} 222```