• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Class (WebSchemeHandler)
2
3Represents a **WebSchemeHandler** object used to intercept requests for a specific scheme.
4
5> **NOTE**
6>
7> - The initial APIs of this module are supported since API version 9. Updates will be marked with a superscript to indicate their earliest API version.
8>
9> - The initial APIs of this class are supported since API version 12.
10>
11> - You can preview how this component looks on a real device, but not in DevEco Studio Previewer.
12
13## Module to Import
14
15```ts
16import { webview } from '@kit.ArkWeb';
17```
18
19## onRequestStart<sup>12+</sup>
20
21onRequestStart(callback: (request: WebSchemeHandlerRequest, handler: WebResourceHandler) => boolean): void
22
23Called when a request starts. In this callback, you can determine whether to intercept the request. If **false** is returned, the request is not intercepted and the handler is invalid. If **true** is returned, the request is intercepted.
24
25**System capability**: SystemCapability.Web.Webview.Core
26
27**Parameters**
28
29| Name  | Type                | Mandatory| Description      |
30| -------- | -------------------- | ---- | ---------- |
31| callback   | (request: [WebSchemeHandlerRequest](./arkts-apis-webview-WebSchemeHandlerRequest.md), handler: [WebResourceHandler](./arkts-apis-webview-WebResourceHandler.md)) => boolean | Yes| Callback invoked when a request for the specified scheme starts. **request** represents a request. **handler** provides the custom response header and response body for the **Web** component. The return value indicates whether the request is intercepted.|
32
33**Error codes**
34
35For details about the error codes, see [Webview Error Codes](errorcode-webview.md).
36
37| Error Code| Error Message                             |
38| -------- | ------------------------------------- |
39| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
40
41**Example**
42
43```ts
44// xxx.ets
45import { webview } from '@kit.ArkWeb';
46import { BusinessError } from '@kit.BasicServicesKit';
47import { buffer } from '@kit.ArkTS';
48import { WebNetErrorList } from '@ohos.web.netErrorList';
49
50@Entry
51@Component
52struct WebComponent {
53  controller: webview.WebviewController = new webview.WebviewController();
54  schemeHandler: webview.WebSchemeHandler = new webview.WebSchemeHandler();
55  htmlData: string = "<html><body bgcolor=\"white\">Source:<pre>source</pre></body></html>";
56
57  build() {
58    Column() {
59      Web({ src: 'https://www.example.com', controller: this.controller })
60        .onControllerAttached(() => {
61          try {
62            this.schemeHandler.onRequestStart((request: webview.WebSchemeHandlerRequest, resourceHandler: webview.WebResourceHandler) => {
63              console.log("[schemeHandler] onRequestStart");
64              try {
65                console.log("[schemeHandler] onRequestStart url:" + request.getRequestUrl());
66                console.log("[schemeHandler] onRequestStart method:" + request.getRequestMethod());
67                console.log("[schemeHandler] onRequestStart referrer:" + request.getReferrer());
68                console.log("[schemeHandler] onRequestStart isMainFrame:" + request.isMainFrame());
69                console.log("[schemeHandler] onRequestStart hasGesture:" + request.hasGesture());
70                console.log("[schemeHandler] onRequestStart header size:" + request.getHeader().length);
71                console.log("[schemeHandler] onRequestStart resource type:" + request.getRequestResourceType());
72                console.log("[schemeHandler] onRequestStart frame url:" + request.getFrameUrl());
73                let header = request.getHeader();
74                for (let i = 0; i < header.length; i++) {
75                  console.log("[schemeHandler] onRequestStart header:" + header[i].headerKey + " " + header[i].headerValue);
76                }
77                let stream = request.getHttpBodyStream();
78                if (stream) {
79                  console.log("[schemeHandler] onRequestStart has http body stream");
80                } else {
81                  console.log("[schemeHandler] onRequestStart has no http body stream");
82                }
83              } catch (error) {
84                console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
85              }
86
87              if (request.getRequestUrl().endsWith("example.com")) {
88                return false;
89              }
90
91              let response = new webview.WebSchemeHandlerResponse();
92              try {
93                response.setNetErrorCode(WebNetErrorList.NET_OK);
94                response.setStatus(200);
95                response.setStatusText("OK");
96                response.setMimeType("text/html");
97                response.setEncoding("utf-8");
98                response.setHeaderByName("header1", "value1", false);
99              } catch (error) {
100                console.error(`[schemeHandler] ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
101              }
102
103              // Before calling didFinish or didFail, call didReceiveResponse to send a response header to this request.
104              let buf = buffer.from(this.htmlData)
105              try {
106                if (buf.length == 0) {
107                  console.log("[schemeHandler] length 0");
108                  resourceHandler.didReceiveResponse(response);
109                  // If the value of buf.length is 0 in normal cases, call resourceHandler.didFinish(). Otherwise, call resourceHandler.didFail().
110                  resourceHandler.didFail(WebNetErrorList.ERR_FAILED);
111                } else {
112                  console.log("[schemeHandler] length 1");
113                  resourceHandler.didReceiveResponse(response);
114                  resourceHandler.didReceiveResponseBody(buf.buffer);
115                  resourceHandler.didFinish();
116                }
117              } catch (error) {
118                console.error(`[schemeHandler] ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
119              }
120              return true;
121            })
122
123            this.schemeHandler.onRequestStop((request: webview.WebSchemeHandlerRequest) => {
124              console.log("[schemeHandler] onRequestStop");
125            });
126
127            this.controller.setWebSchemeHandler('https', this.schemeHandler);
128          } catch (error) {
129            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
130          }
131        })
132        .javaScriptAccess(true)
133        .domStorageAccess(true)
134    }
135  }
136}
137```
138## onRequestStop<sup>12+</sup>
139
140onRequestStop(callback: Callback\<WebSchemeHandlerRequest\>): void
141
142Called when a request is complete, under the prerequisite that the request is indicated as intercepted in the **onRequestStart** callback. Specifically, this callback is invoked in the following cases:
143
1441. The **WebResourceHandler** object calls **didFail** or **didFinish**.
145
1462. The request is interrupted due to other reasons.
147
148**System capability**: SystemCapability.Web.Webview.Core
149
150**Parameters**
151
152| Name  | Type                | Mandatory| Description      |
153| -------- | -------------------- | ---- | ---------- |
154| callback | Callback\<[WebSchemeHandlerRequest](./arkts-apis-webview-WebSchemeHandlerRequest.md)\> | Yes  | Callback invoked when the request is complete.|
155
156**Error codes**
157
158For details about the error codes, see [Webview Error Codes](errorcode-webview.md).
159
160| Error Code| Error Message                             |
161| -------- | ------------------------------------- |
162| 401 | Invalid input parameter. |
163
164**Example**
165
166For the complete sample code, see [onRequestStart](#onrequeststart12).
167