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