美文网首页
鸿蒙webview拦截网络请求 代理 添加请求头/响应头 跨域

鸿蒙webview拦截网络请求 代理 添加请求头/响应头 跨域

作者: 田文健 | 来源:发表于2025-06-25 19:38 被阅读0次

可以拿到请求body,请求头并在处理之后使用 WebResourceHandler 返回响应。

webview.WebviewController.setWebDebuggingAccess(true)
    this.schemeHandler.onRequestStart((request: webview.WebSchemeHandlerRequest,
      handler: webview.WebResourceHandler) => {
      console.log(request.getRequestUrl(), request.getRequestMethod());
      let body = request.getHttpBodyStream();
      if (body) {
        body.initialize().then(() => {
          body?.read(body.getSize()).then((buffer) => {
            console.log("body", new util.TextDecoder().decodeToString(new Uint8Array(buffer)));

            let resp = new webview.WebSchemeHandlerResponse();
            resp.setStatus(200)
            resp.setHeaderByName('Access-Control-Allow-Origin', '*', true);
            resp.setHeaderByName('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS', true);
            resp.setHeaderByName('Access-Control-Max-Age', '86400', true);
            let data = new Uint8Array(202);
            new util.TextEncoder().encodeIntoUint8Array("POST 2222" + request.getRequestUrl(), data)
            handler.didReceiveResponseBody(data.buffer);
            handler.didReceiveResponse(resp);
            handler.didFinish();
          })
        })
      } else {
        let resp = new webview.WebSchemeHandlerResponse();
        resp.setHeaderByName('Access-Control-Allow-Origin', '*', true);
        resp.setHeaderByName('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS', true);
        resp.setHeaderByName('Access-Control-Max-Age', '86400', true);
        resp.setStatus(200)
        let data = new Uint8Array(200);
        new util.TextEncoder().encodeIntoUint8Array("GET 2222" + request.getRequestUrl(), data)
        handler.didReceiveResponseBody(data.buffer);
        handler.didReceiveResponse(resp);
        handler.didFinish();
      }

      return true;
    });

需要在controller被启用的时候设置schemeHandler

Web({ controller: this.controller, src: `${VIRTUAL_PATH}/index.html`, renderMode: RenderMode.ASYNC_RENDER, })
        .width('100%')
        .height('100%')
        .onControllerAttached(() => {
          this.controller.setWebSchemeHandler("http", this.schemeHandler);
          this.controller.setWebSchemeHandler("https", this.schemeHandler);
        })
        .....

    }

参考文档 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-webview-webschemehandler#onrequeststart12

相关文章

网友评论

      本文标题:鸿蒙webview拦截网络请求 代理 添加请求头/响应头 跨域

      本文链接:https://www.haomeiwen.com/subject/xiofwjtx.html