• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)。