【HarmonyOS NEXT】API 12如何实现网络请求自定义拦截器

 【关键字】

API 12 / 网络请求 / 自定义拦截器 / demo / header

【问题描述】

在API 12中如何自定义请求头拦截器呢,能否给个demo看一下如何进行设置header,然后进行next的操作。

【解决方案】

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值