HarmonyOS 鸿蒙Next API11中Web部件的onInterceptRequest方法设计有问题

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next API11中Web部件的onInterceptRequest方法设计有问题 Web部件的onInterceptRequest的callback参数是一个函数, 其返回值类型是WebResourceResponse, 文档中说, 该函数返回null时, 代表不做拦截, 但是在api11中, 返回值类型不包含null时, 不能返回null, 从而无法按需拦截

2 回复

如果您需要进行拦截,那么您需要对WebResourceResponse重新定义,设置您的拦截策略。如果不需要拦截,则直接返回null即可。

【不拦截】直接返回web中设置的网页

import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {
  controller: web_webview.WebviewController = new web_webview.WebviewController()
  responseweb: WebResourceResponse = new WebResourceResponse();
  heads:Header[] = new Array()
  @State webdata: string = "<!DOCTYPE html>\n" +
    "<html>\n"+
    "<head>\n"+
    "<title>intercept test</title>\n"+
    "</head>\n"+
    "<body>\n"+
    "<h1>intercept test</h1>\n"+
    "</body>\n"+
    "</html>"
  build() {
    Column() {
      Web({ src: 'www.example.com', controller: this.controller })
        .onInterceptRequest((event) => {
          if (event) {
            console.log('url:' + event.request.getRequestUrl())
          }
          return null
        })
    }
  }
}

【拦截】设置拦截策略,将按策略执行,下面样例替换成新的html

import web_webview from '@ohos.web.webview'
@Entry
@Component
struct WebComponent {
  controller: web_webview.WebviewController = new web_webview.WebviewController()
  responseweb: WebResourceResponse = new WebResourceResponse()
  heads:Header[] = new Array()
  @State webdata: string = "<!DOCTYPE html>\n" +
    "<html>\n"+
    "<head>\n"+
    "<title>intercept test</title>\n"+
    "</head>\n"+
    "<body>\n"+
    "<h1>intercept test</h1>\n"+
    "</body>\n"+
    "</html>"
  build() {
    Column() {
      Web({ src: 'www.example.com', controller: this.controller })
        .onInterceptRequest((event) => {
          if (event) {
            console.log('url:' + event.request.getRequestUrl())
          }
          let head1:Header = {
            headerKey:"Connection",
            headerValue:"keep-alive"
          }
          let head2:Header = {
            headerKey:"Cache-Control",
            headerValue:"no-cache"
          }
          let length = this.heads.push(head1)
          length = this.heads.push(head2)
          this.responseweb.setResponseHeader(this.heads)
          this.responseweb.setResponseData(this.webdata)
          this.responseweb.setResponseEncoding('utf-8')
          this.responseweb.setResponseMimeType('text/html')
          this.responseweb.setResponseCode(200)
          this.responseweb.setReasonMessage('OK')
          return this.responseweb
        })
    }
  }
}

箭头函数是通过函数体内容来判断返回类型的,直接写null变成无返回了,具体可以看下箭头函数介绍:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/introduction-to-arkts-V13

而华为工单3截图中第一个test的问题和上面一样,testMethod return的是一个null,第二个test是传递参数不对,定义的test传参是String类型。

更多关于HarmonyOS 鸿蒙Next API11中Web部件的onInterceptRequest方法设计有问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next API11版本中,如果开发者遇到Web部件的onInterceptRequest方法设计上的问题,这通常可能涉及到该方法的预期行为与实际实现之间的差异,或者是该方法在处理特定Web请求时的逻辑问题。

具体来说,onInterceptRequest方法的设计旨在允许开发者在Web视图加载资源之前拦截并处理这些请求。如果该方法的设计被认为有问题,可能是因为:

  1. 方法的调用时机不符合预期,导致某些请求被错误地拦截或未被拦截。
  2. 方法的参数或返回值设计不合理,使得开发者难以准确判断和处理请求。
  3. 方法在处理复杂请求或特定类型的请求时存在逻辑缺陷。

针对这些问题,开发者可以尝试查阅HarmonyOS的官方文档,了解onInterceptRequest方法的详细设计和使用指南。同时,也可以检查自己的代码实现,确保正确使用了该方法,并遵循了HarmonyOS的最佳实践。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部