HarmonyOS 网络请求自定义拦截器如何实现

HarmonyOS
2024-12-27 17:12:16
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
fox280

demo如下:

import { rcp } from '@kit.RemoteCommunicationKit';
import url from '@ohos.url';

export interface Logger {
  log: (text: string) => void;
}

export class HeaderInterceptor implements rcp.Interceptor {
  private readonly logger: Logger;

  constructor(logger: Logger) {
    this.logger = logger;
  }

  async intercept(context: rcp.RequestContext, next: rcp.RequestHandler): Promise<rcp.Response> {
    // 修改请请求头内容
    let header = context.request.headers;
    this.logger.log(`[HeaderInterceptor]: curr header is : ${header}`);
    let newHeader: rcp.RequestHeaders | undefined = doSomethingForHeader(header);
    this.logger.log(`[HeaderInterceptor]: new header is : ${header}`);
    context.request.headers = newHeader;

    // 给下个拦截器处理
    return next.handle(context);
  }
}

export class DecryptInterceptor implements rcp.Interceptor {
  private readonly logger: Logger;

  constructor(logger: Logger) {
    this.logger = logger;
  }

  async intercept(context: rcp.RequestContext, next: rcp.RequestHandler): Promise<rcp.Response> {
    let url = context.request.url;
    // 地址不需要解密
    if (!needDecode(url)) {
      // 交给下个拦截器处理
      return next.handle(context);
    }

    // 拿到响应结果
    let response = await next.handle(context);
    if (!response || response.statusCode != 200 || !response.body) {
      Promise.resolve(response);
    }

    // 处理解密逻辑
    return Promise.resolve(decodeResp(response) as rcp.Response);
  }
}

function doSomethingForHeader(header: rcp.RequestHeaders | undefined): rcp.RequestHeaders | undefined {
  return header;
}

// 根据url判断是否解密
function needDecode(url: url.URL) {
  return true;
}


function decodeResp(response: rcp.Response): Response {
  return new Response(decodeBody(response.body), response);
}

class Response {
  request: rcp.Request;
  statusCode: number;
  headers: rcp.ResponseHeaders;
  effectiveUrl?: rcp.URL;
  body?: ArrayBuffer;
  downloadedTo?: rcp.DownloadedTo;
  debugInfo?: rcp.DebugInfo[];
  timeInfo?: rcp.TimeInfo;
  cookies?: rcp.ResponseCookie[];
  httpVersion?: rcp.HttpVersion;
  reasonPhrase?: string;

  constructor(body: ArrayBuffer, response: rcp.Response) {
    this.request = response.request;
    this.statusCode = response.statusCode;
    this.headers = response.headers;
    this.effectiveUrl = response.effectiveUrl;
    this.downloadedTo = response.downloadedTo;
    this.debugInfo = response.debugInfo;
    this.timeInfo = response.timeInfo;
    this.cookies = response.cookies;
    this.httpVersion = response.httpVersion;
    this.reasonPhrase = response.reasonPhrase;
    this.body = body;
  }
}

// 解密 body
function decodeBody(body: ArrayBuffer): string | ArrayBuffer {
  throw new Error('Function not implemented.');
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
分享
微博
QQ
微信
回复
2024-12-27 20:13:00
相关问题
HarmonyOS rcp请求拦截器
1505浏览 • 1回复 待解决
HarmonyOS 导航路由拦截器如何实现
694浏览 • 1回复 待解决
HarmonyOS rcp拦截器
755浏览 • 1回复 待解决
有没有带拦截器网络库可以封装
1111浏览 • 1回复 待解决
webview如何实现网络请求拦截功能
2935浏览 • 1回复 待解决
HarmonyOS router有没有拦截器?
572浏览 • 1回复 待解决
HarmonyOS 是否有前置路由拦截器
608浏览 • 1回复 待解决
HarmonyOS ArkTS 如何实现自定义装饰
801浏览 • 1回复 待解决
HarmonyOS web拦截网络请求
782浏览 • 1回复 待解决
HarmonyOS WebView拦截网络请求
1322浏览 • 1回复 待解决