1# Class (WebSchemeHandler) 2<!--Kit: ArkWeb--> 3<!--Subsystem: Web--> 4<!--Owner: @aohui--> 5<!--Designer: @yaomingliu--> 6<!--Tester: @ghiker--> 7<!--Adviser: @HelloCrease--> 8 9用于拦截指定scheme的请求的拦截器。 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## onRequestStart<sup>12+</sup> 26 27onRequestStart(callback: (request: WebSchemeHandlerRequest, handler: WebResourceHandler) => boolean): void 28 29当请求开始时的回调,在该回调函数中可以决定是否拦截该请求。当回调返回false是表示不拦截此请求,此时handler失效;当回调返回true,表示拦截此请求。 30 31**系统能力:** SystemCapability.Web.Webview.Core 32 33**参数**: 34 35| 参数名 | 类型 | 必填 | 说明 | 36| -------- | -------------------- | ---- | ---------- | 37| callback | (request: [WebSchemeHandlerRequest](./arkts-apis-webview-WebSchemeHandlerRequest.md), handler: [WebResourceHandler](./arkts-apis-webview-WebResourceHandler.md)) => boolean | 是 | 拦截对应scheme请求开始时触发的回调。request为请求,handler用于提供自定义的返回头以及返回体给Web组件,返回值表示该请求是否拦截。 | 38 39**错误码:** 40 41以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 42 43| 错误码ID | 错误信息 | 44| -------- | ------------------------------------- | 45| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. | 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 Web({ src: 'https://www.example.com', controller: this.controller }) 66 .onControllerAttached(() => { 67 try { 68 this.schemeHandler.onRequestStart((request: webview.WebSchemeHandlerRequest, resourceHandler: webview.WebResourceHandler) => { 69 console.info("[schemeHandler] onRequestStart"); 70 try { 71 console.info("[schemeHandler] onRequestStart url:" + request.getRequestUrl()); 72 console.info("[schemeHandler] onRequestStart method:" + request.getRequestMethod()); 73 console.info("[schemeHandler] onRequestStart referrer:" + request.getReferrer()); 74 console.info("[schemeHandler] onRequestStart isMainFrame:" + request.isMainFrame()); 75 console.info("[schemeHandler] onRequestStart hasGesture:" + request.hasGesture()); 76 console.info("[schemeHandler] onRequestStart header size:" + request.getHeader().length); 77 console.info("[schemeHandler] onRequestStart resource type:" + request.getRequestResourceType()); 78 console.info("[schemeHandler] onRequestStart frame url:" + request.getFrameUrl()); 79 let header = request.getHeader(); 80 for (let i = 0; i < header.length; i++) { 81 console.info("[schemeHandler] onRequestStart header:" + header[i].headerKey + " " + header[i].headerValue); 82 } 83 let stream = request.getHttpBodyStream(); 84 if (stream) { 85 console.info("[schemeHandler] onRequestStart has http body stream"); 86 } else { 87 console.info("[schemeHandler] onRequestStart has no http body stream"); 88 } 89 } catch (error) { 90 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 91 } 92 93 if (request.getRequestUrl().endsWith("example.com")) { 94 return false; 95 } 96 97 let response = new webview.WebSchemeHandlerResponse(); 98 try { 99 response.setNetErrorCode(WebNetErrorList.NET_OK); 100 response.setStatus(200); 101 response.setStatusText("OK"); 102 response.setMimeType("text/html"); 103 response.setEncoding("utf-8"); 104 response.setHeaderByName("header1", "value1", false); 105 } catch (error) { 106 console.error(`[schemeHandler] ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 107 } 108 109 // 调用 didFinish/didFail 前需要优先调用 didReceiveResponse 将构造的响应头传递给被拦截的请求。 110 let buf = buffer.from(this.htmlData) 111 try { 112 if (buf.length == 0) { 113 console.info("[schemeHandler] length 0"); 114 resourceHandler.didReceiveResponse(response); 115 // 如果认为buf.length为0是正常情况,则调用resourceHandler.didFinish,否则调用resourceHandler.didFail 116 resourceHandler.didFail(WebNetErrorList.ERR_FAILED); 117 } else { 118 console.info("[schemeHandler] length 1"); 119 resourceHandler.didReceiveResponse(response); 120 resourceHandler.didReceiveResponseBody(buf.buffer); 121 resourceHandler.didFinish(); 122 } 123 } catch (error) { 124 console.error(`[schemeHandler] ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 125 } 126 return true; 127 }) 128 129 this.schemeHandler.onRequestStop((request: webview.WebSchemeHandlerRequest) => { 130 console.info("[schemeHandler] onRequestStop"); 131 }); 132 133 this.controller.setWebSchemeHandler('https', this.schemeHandler); 134 } catch (error) { 135 console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`); 136 } 137 }) 138 .javaScriptAccess(true) 139 .domStorageAccess(true) 140 } 141 } 142} 143``` 144## onRequestStop<sup>12+</sup> 145 146onRequestStop(callback: Callback\<WebSchemeHandlerRequest\>): void 147 148当请求完成时的回调,仅当前面onRequestStart中回调决定拦截此请求中触发。触发的时机有以下两点: 149 1501.WebResourceHandler调用didFail或者didFinish。 151 1522.此请求因为其他原因中断。 153 154**系统能力:** SystemCapability.Web.Webview.Core 155 156**参数**: 157 158| 参数名 | 类型 | 必填 | 说明 | 159| -------- | -------------------- | ---- | ---------- | 160| callback | Callback\<[WebSchemeHandlerRequest](./arkts-apis-webview-WebSchemeHandlerRequest.md)\> | 是 | 对应请求结束的回调函数。 | 161 162**错误码:** 163 164以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。 165 166| 错误码ID | 错误信息 | 167| -------- | ------------------------------------- | 168| 401 | Invalid input parameter. | 169 170**示例:** 171 172完整示例代码参考[onRequestStart](#onrequeststart12)。