【关键字】
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.');
}