HarmonyOS 鸿蒙Next中RCP请求拦截器如何赋值headers?

HarmonyOS 鸿蒙Next中RCP请求拦截器如何赋值headers? 我想使用rcp的请求拦截器时请求头每次使用的参数都是最新的,参照示例代码这么写了,IDE不报错,运行也不报错,就是网络请求不到正确数据了,去掉这个拦截器又正常了,麻烦大佬帮我看看有什么问题:

export class HeaderInterceptor implements rcp.Interceptor {

  intercept(context: rcp.RequestContext, next: rcp.RequestHandler): Promise<rcp.Response> {
    context.request.headers = {
      "version": AppInfoUtils.getVerName(),
      "versionCode": AppInfoUtils.getVerCode() + "",
      "appkey": UserDataCache.getInstance().getAppKey(),
      "authorization": UserDataCache.getInstance().getToken()
    }
    return next.handle(context);
  }

}

更多关于HarmonyOS 鸿蒙Next中RCP请求拦截器如何赋值headers?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

【背景知识】 在客户端发送HTTP请求到达目标服务器之前,可以使用拦截器对请求进行修改,具体可参考拦截器:更丰富、更高阶的定制能力文档。 rcp网络请求拦截器的请求与响应拦截可参考rcp网络请求拦截器文档。

【问题定位】

export class HeaderInterceptor implements rcp.Interceptor {
  intercept(context: rcp.RequestContext, next: rcp.RequestHandler): Promise<rcp.Response> {
    context.request.headers = {
      "version": AppInfoUtils.getVerName(),
      "versionCode": AppInfoUtils.getVerCode() + "",
      "appkey": UserDataCache.getInstance().getAppKey(),
      "authorization": UserDataCache.getInstance().getToken()
    }
    return next.handle(context);
  }
}

该代码将headers覆盖了,需要保留原headers,再新增需要的。

【分析结论】 应该在已有的headers上追加/修改字段,而不是整体替换。

context.request.headers = {
  "content-type": "application/json",
}
console.info('test rcp 1 JSON.stringify(context.request.headers ):', JSON.stringify(context.request.headers ))

context.request.headers = {
  "version": "1",
  "versionCode": "1",
  "appkey": "1",
  "authorization":  "1"
}
console.info('test rcp 2 JSON.stringify(context.request.headers ):', JSON.stringify(context.request.headers ))

日志输出,可以得出将原本headers覆盖:

test rcp 1 JSON.stringify(context.request.headers ): {"content-type":"application/json"}
test rcp 2 JSON.stringify(context.request.headers ): {"version":"1","versionCode":"1","appkey":"1","authorization":"1"}

【修改建议】 追加自定义的header,而不是整体替换。代码如下:

context.request.headers["version"] = "1"
context.request.headers["versionCode"] = "1"
context.request.headers["appkey"] = "1"
context.request.headers["authorization"] = "1"

日志输出:

test rcp 1 JSON.stringify(context.request.headers ): {"content-type":"application/json"}
test rcp 2 JSON.stringify(context.request.headers ): {"content-type":"application/json","version":"1","versionCode":"1","appkey":"1","authorization":"1"}

更多关于HarmonyOS 鸿蒙Next中RCP请求拦截器如何赋值headers?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我是不是把headers覆盖了?怎么在headers里面新增呢?

在HarmonyOS Next中,通过HttpClient实例创建请求拦截器,在onRequest回调内使用request.setHeader()方法设置headers。示例代码:

import http from '@ohos.net.http';

let client = http.createHttp();
client.on('headersReceive', (event) => {
    // 请求拦截
    let request = event.request;
    request.setHeader('Custom-Header', 'HeaderValue');
});

通过拦截器的headersReceive事件处理请求头赋值,直接操作请求对象设置所需header字段。

在HarmonyOS Next的RCP拦截器中,直接覆盖整个headers对象可能导致原有请求头丢失,从而引发网络请求异常。建议使用追加方式设置请求头:

export class HeaderInterceptor implements rcp.Interceptor {
  async intercept(context: rcp.RequestContext, next: rcp.RequestHandler): Promise<rcp.Response> {
    // 保留原有headers,仅追加新字段
    context.request.headers = {
      ...context.request.headers,
      "version": AppInfoUtils.getVerName(),
      "versionCode": AppInfoUtils.getVerCode() + "",
      "appkey": UserDataCache.getInstance().getAppKey(),
      "authorization": UserDataCache.getInstance().getToken()
    };
    return await next.handle(context);
  }
}

关键点:

  1. 使用扩展运算符...保留原始请求头
  2. 添加async/await确保异步操作正确执行
  3. 避免直接覆盖headers对象导致必要头信息丢失

这种写法能确保在添加自定义请求头的同时,不影响原有的Content-Type、User-Agent等系统自动添加的请求头。

回到顶部