# 使用HTTP全局拦截器 (C/C++)

## 场景介绍

从API version 24开始，通过HTTP全局拦截器（全局HTTP拦截器包含只读拦截器和可修改拦截器），开发者可以在只读拦截器中监控HTTP流量，实现日志记录功能，也可以在可修改拦截器中添加自定义逻辑，实现修改请求头、修改响应头、修改响应体等功能。

## 接口说明

HTTP全局拦截器常用接口如下表所示，详细的接口说明请参考[http_interceptor.h](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-net-http-interceptor-h)。

|接口名|描述|
|:----------------------------------------------------------------------|:-------------------|
|OH_Http_AddReadOnlyInterceptor(struct OH_Http_Interceptor *interceptor)|添加一个HTTP全局只读拦截器。|
|OH_Http_AddWritableInterceptor(struct OH_Http_Interceptor *interceptor)|添加一个HTTP全局可修改拦截器。|
|OH_Http_RemoveInterceptor(struct OH_Http_Interceptor *interceptor)|删除指定的HTTP全局拦截器。|
|OH_Http_RemoveAllInterceptors(int32_t groupId)|删除指定组ID的所有HTTP全局拦截器。|
|OH_Http_StartAllInterceptors(int32_t groupId)|启用指定组ID的所有HTTP全局拦截器。|
|OH_Http_StopAllInterceptors(int32_t groupId)|停用指定组ID的所有HTTP全局拦截器。|

## 开发步骤

使用本文档涉及接口创建并使用HTTP全局拦截器时，需先创建Native C++工程，在源文件中封装相关接口，然后在ArkTS层调用封装好的接口，使用hilog或console.info等方法将日志打印到控制台或生成设备日志。

本文以添加HTTP全局只读响应拦截器、可修改请求拦截器、可修改响应拦截器为例，提供具体的开发指导。

### 添加开发依赖

**添加动态链接库**

CMakeLists.txt中添加以下lib:

```txt
libace_napi.z.so
libhttp_interceptor.so
```

**头文件**

```c
#include "napi/native_api.h"
#include "network/netstack/http_interceptor.h"
#include "network/netstack/http_interceptor_type.h"
```

### 构建工程

1. 在源文件中编写调用该API的代码，实现HTTP全局拦截器的处理函数和相关操作。

       #include "napi/native_api.h"
       #include "network/netstack/http_interceptor.h"
       #include "network/netstack/http_interceptor_type.h"
       #include "hilog/log.h"

       #include <cstring>
       #include <cstdlib>
       #include <string>

       #undef LOG_DOMAIN
       #undef LOG_TAG
       #define LOG_DOMAIN 0x3200 // 全局domain宏，标识业务领域
       #define LOG_TAG "HttpInterceptorDemo"  // 全局tag宏，标识模块日志tag

       // 全局只读响应拦截器实例
       static OH_Http_Interceptor g_readOnlyResponseInterceptor = {
           .groupId = 1,
           .stage = OH_STAGE_RESPONSE,
           .type = OH_TYPE_READ_ONLY,
           .enabled = 1,
           .handler = nullptr,
       };

       // 可修改请求拦截器实例（用于修改Network Kit的请求数据包）
       static OH_Http_Interceptor g_modifyRequestInterceptor = {
           .groupId = 2,
           .stage = OH_STAGE_REQUEST,
           .type = OH_TYPE_MODIFY_NETWORK_KIT,
           .enabled = 1,
           .handler = nullptr,
       };

       // 可修改响应拦截器实例（用于修改Network Kit的响应数据包）
       static OH_Http_Interceptor g_modifyResponseInterceptor = {
           .groupId = 3,
           .stage = OH_STAGE_RESPONSE,
           .type = OH_TYPE_MODIFY_NETWORK_KIT,
           .enabled = 1,
           .handler = nullptr,
       };

       // 内存分配和字符串拷贝辅助函数
       char *MallocCString(const std::string &origin)
       {
           if (origin.empty()) {
               return nullptr;
           }

           auto len = origin.length() + 1;
           char *res = static_cast<char *>(malloc(sizeof(char) * len));
           if (res == nullptr) {
               return nullptr;
           }
           return std::char_traits<char>::copy(res, origin.c_str(), len);
       }

       // 日志打印辅助函数
       void LogHeader(OH_Http_Interceptor_Headers *headers)
       {
           OH_LOG_INFO(LOG_APP, "---------------------header begin---------------------");
           while (headers != nullptr) {
               if (headers->data != nullptr) {
                   OH_LOG_INFO(LOG_APP, "%{public}s", headers->data);
               }
               headers = headers->next;
           }
           OH_LOG_INFO(LOG_APP, "---------------------header end---------------------");
       }

       // 打印响应信息
       void PrintResponseInfo(OH_Http_Interceptor_Response *response)
       {
           OH_LOG_INFO(LOG_APP, "-----PrintResponseInfo Begin-----");
           if (response != nullptr) {
               OH_LOG_INFO(LOG_APP, "responseCode = %{public}d", response->responseCode);
               if (response->body.buffer != nullptr) {
                   OH_LOG_INFO(LOG_APP, "body = %{public}s", response->body.buffer);
               }
               if (response->headers != nullptr) {
                   LogHeader(response->headers);
               }

               OH_LOG_INFO(LOG_APP, "dns: %{public}lf", response->performanceTiming.dnsTiming);
               OH_LOG_INFO(LOG_APP, "tcp: %{public}lf", response->performanceTiming.tcpTiming);
               OH_LOG_INFO(LOG_APP, "tls: %{public}lf", response->performanceTiming.tlsTiming);
               OH_LOG_INFO(LOG_APP, "snd: %{public}lf", response->performanceTiming.firstSendTiming);
               OH_LOG_INFO(LOG_APP, "rcv: %{public}lf", response->performanceTiming.firstReceiveTiming);
               OH_LOG_INFO(LOG_APP, "tot: %{public}lf", response->performanceTiming.totalFinishTiming);
               OH_LOG_INFO(LOG_APP, "rdr: %{public}lf", response->performanceTiming.redirectTiming);
               OH_LOG_INFO(LOG_APP, "-----PrintResponseInfo End-----");
           }
       }

       // 只读响应拦截器处理函数
       OH_Interceptor_Result ReadOnlyResponseInterceptorHandler(
           OH_Http_Interceptor_Request *request,
           OH_Http_Interceptor_Response *response,
           int32_t *isModified)
       {
           (void)request;
           (void)isModified;
           
           if (response != nullptr) {
               OH_LOG_INFO(LOG_APP, "---ReadOnly Response Interceptor Handler---");
               PrintResponseInfo(response);
           }
           return OH_CONTINUE;
       }

       // 修改请求方法
       static void ModifyRequestMethod(OH_Http_Interceptor_Request *request)
       {
           if (request->method.buffer != nullptr) {
               // 释放原有内存，必须使用free释放由malloc分配的内存
               free((void *)request->method.buffer);
               
               // 重新申请内存并设置新值，必须使用malloc分配内存
               const std::string newMethodStr = "GET";
               char *newMethodBuffer = MallocCString(newMethodStr);
               if (newMethodBuffer != nullptr) {
                   request->method.buffer = newMethodBuffer;
                   request->method.length = newMethodStr.length();
                   OH_LOG_INFO(LOG_APP, "Modified Method: %{public}s", request->method.buffer);
               }
           }
       }

       // 修改第一个header节点
       static void ModifyFirstHeaderNode(OH_Http_Interceptor_Headers **headers, const char *headerData)
       {
           size_t headerLen = strlen(headerData) + 1;
           
           if (*headers != nullptr) {
               // 修改第一个header节点
               if ((*headers)->data != nullptr) {
                   // 释放原有内存，必须使用free释放由malloc分配的内存
                   free((void *)(*headers)->data);
               }
               // 必须使用malloc分配内存
               const std::string headerDataStr = headerData;
               char *headerBuffer = MallocCString(headerDataStr);
               if (headerBuffer != nullptr) {
                   (*headers)->data = headerBuffer;
                   OH_LOG_INFO(LOG_APP, "Modified first header: %{public}s", headerData);
               }
           } else {
               // 若没有header节点，创建新的第一个节点
               // 创建新的header节点，必须使用malloc分配内存
               OH_Http_Interceptor_Headers *newHeader =
                   (OH_Http_Interceptor_Headers *)malloc(sizeof(OH_Http_Interceptor_Headers));
               if (newHeader != nullptr) {
                   // 必须使用malloc分配内存
                   const std::string headerDataStr = headerData;
                   char *headerBuffer = MallocCString(headerDataStr);
                   if (headerBuffer != nullptr) {
                       newHeader->data = headerBuffer;
                       newHeader->next = nullptr;
                       *headers = newHeader;
                       OH_LOG_INFO(LOG_APP, "Created first header: %{public}s", headerData);
                   } else {
                       // 内存分配失败，释放header节点，必须使用free释放由malloc分配的内存
                       free((void *)newHeader);
                   }
               }
           }
       }

       // 修改body内容
       static void ModifyBodyContent(Http_Buffer *body, const char *newBodyContent)
       {
           // 释放原有body内存，必须使用free释放由malloc分配的内存
           if (body->buffer != nullptr) {
               free((void *)body->buffer);
           }
           
           // 重新申请内存并设置新的body内容，必须使用malloc分配内存
           const std::string bodyContentStr = newBodyContent;
           char *bodyBuffer = MallocCString(bodyContentStr);
           if (bodyBuffer != nullptr) {
               body->buffer = bodyBuffer;
               body->length = bodyContentStr.length();
               OH_LOG_INFO(LOG_APP, "Modified Body: %{public}s", body->buffer);
           }
       }

       // 可修改请求拦截器处理函数（修改Network Kit的请求数据包）
       OH_Interceptor_Result ModifyRequestInterceptorHandler(
           OH_Http_Interceptor_Request *request,
           OH_Http_Interceptor_Response *response,
           int32_t *isModified)
       {
           (void)response;
           
           if (request != nullptr) {
               OH_LOG_INFO(LOG_APP, "---Modify Interceptor Handler---");
               OH_LOG_INFO(LOG_APP, "Original URL: %{public}s", request->url.buffer);
               OH_LOG_INFO(LOG_APP, "Original Method: %{public}s", request->method.buffer);
               
               // 修改请求方法
               ModifyRequestMethod(request);
               
               // 修改第一个请求头
               const char *requestHeaderData = "X-Custom-Header: CustomValue";
               ModifyFirstHeaderNode(&request->headers, requestHeaderData);
               
               // 修改请求体
               const char *requestBodyData = "{\"key\": \"value\"}";
               ModifyBodyContent(&request->body, requestBodyData);
               
               // 标记为已修改
               *isModified = 1;
               OH_LOG_INFO(LOG_APP, "Request modified: %{public}d", *isModified);
           }
           
           // 返回OH_CONTINUE表示继续处理请求
           // 返回OH_ABORT表示中止请求，请求将不会发送到服务器
           return OH_CONTINUE;
       }

       // 可修改响应拦截器处理函数（修改Network Kit的响应数据包）
       OH_Interceptor_Result ModifyResponseInterceptorHandler(
           OH_Http_Interceptor_Request *request,
           OH_Http_Interceptor_Response *response,
           int32_t *isModified)
       {
           (void)request;
           
           if (response != nullptr) {
               OH_LOG_INFO(LOG_APP, "---Modify Response Interceptor Handler---");
               OH_LOG_INFO(LOG_APP, "Original Response Code: %{public}d", response->responseCode);
               if (response->body.buffer != nullptr) {
                   OH_LOG_INFO(LOG_APP, "Original Response Body: %{public}s", response->body.buffer);
               }
               
               // 修改响应体
               const char *responseBodyData = "{\"modified\": true, \"message\": \"Response modified by interceptor\"}";
               ModifyBodyContent(&response->body, responseBodyData);
               
               // 修改第一个响应头
               const char *responseHeaderData = "X-Intercepted: true";
               ModifyFirstHeaderNode(&response->headers, responseHeaderData);
               
               // 标记为已修改
               *isModified = 1;
               OH_LOG_INFO(LOG_APP, "Response modified: %{public}d", *isModified);
           }
           
           // 返回OH_CONTINUE表示继续处理响应
           // 返回OH_ABORT表示终止当前拦截器链的执行
           return OH_CONTINUE;
       }

       // 添加只读响应拦截器
       static napi_value AddReadOnlyResponseInterceptor(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 设置拦截器处理函数
           g_readOnlyResponseInterceptor.handler = ReadOnlyResponseInterceptorHandler;
           
           // 添加拦截器
           int ret = OH_Http_AddReadOnlyInterceptor(&g_readOnlyResponseInterceptor);
           
           OH_LOG_INFO(LOG_APP, "AddReadOnlyResponseInterceptor ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 移除只读响应拦截器
       static napi_value RemoveReadOnlyResponseInterceptor(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 移除拦截器
           int ret = OH_Http_RemoveInterceptor(&g_readOnlyResponseInterceptor);
           
           OH_LOG_INFO(LOG_APP, "RemoveReadOnlyResponseInterceptor ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 启用只读响应拦截器组
       static napi_value StartReadOnlyResponseInterceptors(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 启用组ID为1的所有拦截器
           int ret = OH_Http_StartAllInterceptors(1);
           
           OH_LOG_INFO(LOG_APP, "StartReadOnlyResponseInterceptors ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 停用只读响应拦截器组
       static napi_value StopReadOnlyResponseInterceptors(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 停用组ID为1的所有拦截器
           int ret = OH_Http_StopAllInterceptors(1);
           
           OH_LOG_INFO(LOG_APP, "StopReadOnlyResponseInterceptors ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 删除只读响应拦截器组
       static napi_value RemoveAllReadOnlyResponseInterceptors(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 删除组ID为1的所有拦截器
           int ret = OH_Http_RemoveAllInterceptors(1);
           
           OH_LOG_INFO(LOG_APP, "RemoveAllReadOnlyResponseInterceptors ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 添加可修改请求拦截器（OH_TYPE_MODIFY_NETWORK_KIT类型）
       static napi_value AddModifyRequestInterceptor(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 设置拦截器处理函数
           g_modifyRequestInterceptor.handler = ModifyRequestInterceptorHandler;
           
           // 添加可修改拦截器
           int ret = OH_Http_AddWritableInterceptor(&g_modifyRequestInterceptor);
           
           OH_LOG_INFO(LOG_APP, "AddModifyRequestInterceptor ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 移除可修改请求拦截器
       static napi_value RemoveModifyRequestInterceptor(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 移除拦截器
           int ret = OH_Http_RemoveInterceptor(&g_modifyRequestInterceptor);
           
           OH_LOG_INFO(LOG_APP, "RemoveModifyRequestInterceptor ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 启用可修改请求拦截器组
       static napi_value StartModifyRequestInterceptors(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 启用组ID为2的所有拦截器
           int ret = OH_Http_StartAllInterceptors(2);
           
           OH_LOG_INFO(LOG_APP, "StartModifyRequestInterceptors ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 停用可修改请求拦截器组
       static napi_value StopModifyRequestInterceptors(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 停用组ID为2的所有拦截器
           int ret = OH_Http_StopAllInterceptors(2);
           
           OH_LOG_INFO(LOG_APP, "StopModifyRequestInterceptors ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 删除可修改请求拦截器组
       static napi_value RemoveAllModifyRequestInterceptors(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 删除组ID为2的所有拦截器
           int ret = OH_Http_RemoveAllInterceptors(2);
           
           OH_LOG_INFO(LOG_APP, "RemoveAllModifyRequestInterceptors ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 添加可修改响应拦截器（OH_TYPE_MODIFY_NETWORK_KIT类型）
       static napi_value AddModifyResponseInterceptor(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 设置拦截器处理函数
           g_modifyResponseInterceptor.handler = ModifyResponseInterceptorHandler;
           
           // 添加可修改拦截器
           int ret = OH_Http_AddWritableInterceptor(&g_modifyResponseInterceptor);
           
           OH_LOG_INFO(LOG_APP, "AddModifyResponseInterceptor ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 移除可修改响应拦截器
       static napi_value RemoveModifyResponseInterceptor(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 移除拦截器
           int ret = OH_Http_RemoveInterceptor(&g_modifyResponseInterceptor);
           
           OH_LOG_INFO(LOG_APP, "RemoveModifyResponseInterceptor ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 启用可修改响应拦截器组
       static napi_value StartModifyResponseInterceptors(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 启用组ID为3的所有拦截器
           int ret = OH_Http_StartAllInterceptors(3);
           
           OH_LOG_INFO(LOG_APP, "StartModifyResponseInterceptors ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 停用可修改响应拦截器组
       static napi_value StopModifyResponseInterceptors(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 停用组ID为3的所有拦截器
           int ret = OH_Http_StopAllInterceptors(3);
           
           OH_LOG_INFO(LOG_APP, "StopModifyResponseInterceptors ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

       // 删除可修改响应拦截器组
       static napi_value RemoveAllModifyResponseInterceptors(napi_env env, napi_callback_info info)
       {
           napi_value result;
           
           // 删除组ID为3的所有拦截器
           int ret = OH_Http_RemoveAllInterceptors(3);
           
           OH_LOG_INFO(LOG_APP, "RemoveAllModifyResponseInterceptors ret: %{public}d", ret);
           napi_create_int32(env, ret, &result);
           return result;
       }

   上述代码实现了多种HTTP全局拦截器，包括只读响应拦截器、可修改请求拦截器和可修改响应拦截器。在拦截器处理函数中，会打印请求或响应的相关信息，如状态码、请求体/响应体、请求头/响应头以及性能指标等。
2. 初始化并导出通过N-API封装的napi_value类型对象，通过外部函数接口将函数提供给JavaScript调用。

       EXTERN_C_START
       static napi_value Init(napi_env env, napi_value exports)
       {
           napi_property_descriptor desc[] = {
               {"AddReadOnlyResponseInterceptor", nullptr, AddReadOnlyResponseInterceptor, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"RemoveReadOnlyResponseInterceptor", nullptr, RemoveReadOnlyResponseInterceptor, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"StartReadOnlyResponseInterceptors", nullptr, StartReadOnlyResponseInterceptors, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"StopReadOnlyResponseInterceptors", nullptr, StopReadOnlyResponseInterceptors, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"RemoveAllReadOnlyResponseInterceptors", nullptr, RemoveAllReadOnlyResponseInterceptors, nullptr, nullptr,
                   nullptr, napi_default, nullptr},
               {"AddModifyRequestInterceptor", nullptr, AddModifyRequestInterceptor, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"RemoveModifyRequestInterceptor", nullptr, RemoveModifyRequestInterceptor, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"StartModifyRequestInterceptors", nullptr, StartModifyRequestInterceptors, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"StopModifyRequestInterceptors", nullptr, StopModifyRequestInterceptors, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"RemoveAllModifyRequestInterceptors", nullptr, RemoveAllModifyRequestInterceptors, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"AddModifyResponseInterceptor", nullptr, AddModifyResponseInterceptor, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"RemoveModifyResponseInterceptor", nullptr, RemoveModifyResponseInterceptor, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"StartModifyResponseInterceptors", nullptr, StartModifyResponseInterceptors, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"StopModifyResponseInterceptors", nullptr, StopModifyResponseInterceptors, nullptr, nullptr, nullptr,
                   napi_default, nullptr},
               {"RemoveAllModifyResponseInterceptors", nullptr, RemoveAllModifyResponseInterceptors, nullptr, nullptr,
                   nullptr, napi_default, nullptr},
           };
           napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
           return exports;
       }
       EXTERN_C_END

3. 将上一步中初始化成功的对象通过RegisterEntryModule函数，使用napi_module_register函数将模块注册到Node.js中。

       static napi_module demoModule = {
           .nm_version = 1,
           .nm_flags = 0,
           .nm_filename = nullptr,
           .nm_register_func = Init,
           .nm_modname = "entry",
           .nm_priv = ((void *)0),
           .reserved = {0},
       };

       extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
       {
           napi_module_register(&demoModule);
       }

4. 在工程的Index.d.ts文件中定义函数的类型。

   ```TypeScript
   export const AddReadOnlyResponseInterceptor: () => number;
   export const RemoveReadOnlyResponseInterceptor: () => number;
   export const StartReadOnlyResponseInterceptors: () => number;
   export const StopReadOnlyResponseInterceptors: () => number;
   export const RemoveAllReadOnlyResponseInterceptors: () => number;
   export const AddModifyRequestInterceptor: () => number;
   export const RemoveModifyRequestInterceptor: () => number;
   export const StartModifyRequestInterceptors: () => number;
   export const StopModifyRequestInterceptors: () => number;
   export const RemoveAllModifyRequestInterceptors: () => number;
   export const AddModifyResponseInterceptor: () => number;
   export const RemoveModifyResponseInterceptor: () => number;
   export const StartModifyResponseInterceptors: () => number;
   export const StopModifyResponseInterceptors: () => number;
   export const RemoveAllModifyResponseInterceptors: () => number;
   ```

5. 在Index.ets文件中对上述封装好的接口进行调用。

   ```TypeScript
   import { hilog } from '@kit.PerformanceAnalysisKit';
   import httpInterceptor from 'libentry.so';
   import { http } from '@kit.NetworkKit';

   const LOG_TAG: string = 'HttpInterceptorDemo';
   const HTTP_URL_BAIDU: string = "http://www.baidu.com";

   @Entry
   @Component
   struct Index {
     @State message: string = 'ReadOnly Network Kit Response Interceptor';
     scroller: Scroller = new Scroller();

     build() {
       Scroll(this.scroller) {
         Column() {
           Text(this.message)
             .fontSize(20)
             .margin({ bottom: 30 })

           Button('Add ReadOnly Response Interceptor')
             .margin({ top: 10 })
             .width(350)
             .borderRadius(8)
             .id('AddInterceptor')
             .onClick(() => {
               let ret = httpInterceptor.AddReadOnlyResponseInterceptor();
               hilog.info(0x0000, LOG_TAG, `AddReadOnlyResponseInterceptor ret: ${ret}`);
             })

           Button('Start ReadOnly Response Interceptors')
             .id('StartInterceptors')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let ret = httpInterceptor.StartReadOnlyResponseInterceptors();
               hilog.info(0x0000, LOG_TAG, `StartReadOnlyResponseInterceptors ret: ${ret}`);
             })

           Button('Stop ReadOnly Response Interceptors')
             .id('StopInterceptors')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let ret = httpInterceptor.StopReadOnlyResponseInterceptors();
               hilog.info(0x0000, LOG_TAG, `StopReadOnlyResponseInterceptors ret: ${ret}`);
             })

           Button('Remove ReadOnly Response Interceptor')
             .id('RemoveInterceptor')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let ret = httpInterceptor.RemoveReadOnlyResponseInterceptor();
               hilog.info(0x0000, LOG_TAG, `RemoveReadOnlyResponseInterceptor ret: ${ret}`);
             })

           Button('Remove All ReadOnly Response Interceptors')
             .id('RemoveAllInterceptors')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15, bottom: 30 })
             .onClick(() => {
               let ret = httpInterceptor.RemoveAllReadOnlyResponseInterceptors();
               hilog.info(0x0000, LOG_TAG, `RemoveAllReadOnlyResponseInterceptors ret: ${ret}`);
             })

           Text('Modify Network Kit Request Interceptor')
             .fontSize(20)
             .margin({ bottom: 30 })

           Button('Add Modify Request Interceptor')
             .id('AddModifyRequestInterceptor')
             .width(350)
             .borderRadius(8)
             .margin({ top: 10 })
             .onClick(() => {
               let ret = httpInterceptor.AddModifyRequestInterceptor();
               hilog.info(0x0000, LOG_TAG, `AddModifyRequestInterceptor ret: ${ret}`);
             })

           Button('Start Modify Request Interceptors')
             .id('StartModifyRequestInterceptors')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let ret = httpInterceptor.StartModifyRequestInterceptors();
               hilog.info(0x0000, LOG_TAG, `StartModifyRequestInterceptors ret: ${ret}`);
             })

           Button('Stop Modify Request Interceptors')
             .id('StopModifyRequestInterceptors')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let ret = httpInterceptor.StopModifyRequestInterceptors();
               hilog.info(0x0000, LOG_TAG, `StopModifyRequestInterceptors ret: ${ret}`);
             })

           Button('Remove Modify Request Interceptor')
             .id('RemoveModifyRequestInterceptor')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let ret = httpInterceptor.RemoveModifyRequestInterceptor();
               hilog.info(0x0000, LOG_TAG, `RemoveModifyRequestInterceptor ret: ${ret}`);
             })

           Button('Remove All Modify Request Interceptors')
             .id('RemoveAllModifyRequestInterceptors')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15, bottom: 30 })
             .onClick(() => {
               let ret = httpInterceptor.RemoveAllModifyRequestInterceptors();
               hilog.info(0x0000, LOG_TAG, `RemoveAllModifyRequestInterceptors ret: ${ret}`);
             })

           Text('Modify Network Kit Response Interceptor')
             .fontSize(20)
             .margin({ bottom: 30 })

           Button('Add Modify Response Interceptor')
             .id('AddModifyResponseInterceptor')
             .width(350)
             .borderRadius(8)
             .margin({ top: 10 })
             .onClick(() => {
               let ret = httpInterceptor.AddModifyResponseInterceptor();
               hilog.info(0x0000, LOG_TAG, `AddModifyResponseInterceptor ret: ${ret}`);
             })

           Button('Start Modify Response Interceptors')
             .id('StartModifyResponseInterceptors')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let ret = httpInterceptor.StartModifyResponseInterceptors();
               hilog.info(0x0000, LOG_TAG, `StartModifyResponseInterceptors ret: ${ret}`);
             })

           Button('Stop Modify Response Interceptors')
             .id('StopModifyResponseInterceptors')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let ret = httpInterceptor.StopModifyResponseInterceptors();
               hilog.info(0x0000, LOG_TAG, `StopModifyResponseInterceptors ret: ${ret}`);
             })

           Button('Remove Modify Response Interceptor')
             .id('RemoveModifyResponseInterceptor')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let ret = httpInterceptor.RemoveModifyResponseInterceptor();
               hilog.info(0x0000, LOG_TAG, `RemoveModifyResponseInterceptor ret: ${ret}`);
             })

           Button('Remove All Modify Response Interceptors')
             .id('RemoveAllModifyResponseInterceptors')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15, bottom: 30 })
             .onClick(() => {
               let ret = httpInterceptor.RemoveAllModifyResponseInterceptors();
               hilog.info(0x0000, LOG_TAG, `RemoveAllModifyResponseInterceptors ret: ${ret}`);
             })

           Text('Send HTTP Request')
             .fontSize(20)
             .margin({ bottom: 30 })

           Button('Send HTTP Request')
             .id('networkRequest')
             .width(350)
             .borderRadius(8)
             .margin({ top: 15 })
             .onClick(() => {
               let httpRequest: http.HttpRequest = http.createHttp();
               let options: http.HttpRequestOptions = {
                 method: http.RequestMethod.POST,
               };
               httpRequest.request(HTTP_URL_BAIDU, options, (err: BusinessError, res: http.HttpResponse) => {
                 if (err) {
                   hilog.info(0x0000, LOG_TAG, `request fail, error code: ${err.code}, msg: ${err.message}`);
                   httpRequest.destroy();
                 } else {
                   hilog.info(0x0000, LOG_TAG, `res:${JSON.stringify(res)}`);
                   httpRequest.destroy();
                 }
               });
             })
         }
         .width('100%')
       }
     }
   }
   ```

6. 配置CMakeLists.txt，本模块需要用到的共享库是libhttp_interceptor.so，在工程自动生成的CMakeLists.txt中的target_link_libraries中添加此共享库。

   注意：如图所示，在add_library中的entry是工程自动生成的module name，若要做修改，需和步骤 3 中.nm_modname保持一致。

   ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/6d/v3/yv0ejPBUQcSAcWyZXIsn6w/zh-cn_image_0000002778932205.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=28733CCC68AD2D60F664C3F4A5B3F31908047D63F084038BDE513310606D27CF)
7. 调用HTTP全局拦截器C API接口要求应用拥有ohos.permission.INTERNET权限，在module.json5中的requestPermissions项添加该权限。

完成上述步骤后，工程搭建已全部完成，后续可连接设备运行工程并查看日志。

## 测试步骤

1. 连接设备，使用DevEco Studio打开搭建好的工程。

2. 运行工程，设备上会弹出以下图片所示界面。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/9b/v3/YQvZuOxYTMadc7hxjxUHdg/zh-cn_image_0000002749333122.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=AE4D8B95F2F578A890254E020D21369947E2812717265C98ED8F57898CCE669F)

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/36/v3/VTw99JCMRF-1d0jevCRfFA/zh-cn_image_0000002749493006.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=5E4DEF0935E9DA5E584C0D37150892E190A9F9B590970752C841E756CB35FB5D)

* 点击Add Read Only Response Interceptor按钮，添加一个HTTP全局只读响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/36/v3/128_i3RIQiiPUtIxOerzoQ/zh-cn_image_0000002779092065.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=EBB2EB6AADFE6865C65BC0E0D8A60C142262416AE00356AE2DB7C27A299ACD87)

* 点击Start Read Only Response Interceptors按钮，启用组ID为1的所有只读响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/12/v3/D_5GirQTQCOSuGK1fuYmiQ/zh-cn_image_0000002778932207.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=50C72168557EBFD1CE9BC1024618D50189E501FC32576F79E6C67FA4BFA419C2)

* 点击Add Modify Request Interceptor按钮，添加一个HTTP全局可修改请求拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/fa/v3/2Z_Xbw7nRlCfJCBQp6k60g/zh-cn_image_0000002749333124.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=6ECF71F4D7EFD22D1E7C9B194FEA6A009C070DC4DB07534570A82D7BC0EDF3D4)

* 点击Start Modify Request Interceptors按钮，启用组ID为2的所有可修改请求拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/2d/v3/AXreHBJoTA2jd6Sawv8X1Q/zh-cn_image_0000002749493008.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=7236A6AF47842B20CE740C01A353EF950BAB2C8652539716512B0DC7191855CA)

* 点击Add Modify Response Interceptor按钮，添加一个HTTP全局可修改响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/7e/v3/B1nl1-SZQNmhkZ33Rcrbag/zh-cn_image_0000002779092067.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=B743ED19F10C9AD8588956CDF55773FC428105FB08F75C69FFEDD51B98A0642E)

* 点击Start Modify Response Interceptors按钮，启用组ID为3的所有可修改响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3e/v3/FVGtNPMYQSW33ZPW7yivOg/zh-cn_image_0000002778932209.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=991F1BB9B7F983EE0503D1B4C733AA906618C5AF18E4C441EACB47C74867FE64)

* 点击Send HTTP Request按钮，拦截器会捕获响应并打印相关信息到日志。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/b6/v3/zVMqVK4nTUiHO7U7rM0MRw/zh-cn_image_0000002749333126.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=077767AE55B7DA8D1A1DDADA44D6CEB1D0EB82F8DE3A4C7BACFBC3481DC885BD)

* 点击Stop Read Only Response Interceptors按钮，停用组ID为1的只读响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/19/v3/m0kEFFF7TKqkQuw9fvbXIw/zh-cn_image_0000002749493010.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=128BEECEEF4D589B0F39041BD6720E2AB00CBD97F0DC4B26B07E667093299C8C)

* 点击Stop Modify Request Interceptors按钮，停用组ID为2的可修改请求拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/bc/v3/6hubDrQiQ1uDNDEgj3EPKg/zh-cn_image_0000002779092069.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=4019AB8231DA9D09D7ED9CC7FDD0AD662FB271434F686094C1F55F957B0606AD)

* 点击Stop Modify Response Interceptors按钮，停用组ID为3的可修改响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/0f/v3/SW8U_4lJQUulVqb0EbxiXA/zh-cn_image_0000002778932211.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=1251527304293F9EE699192112468210153DD603E70AF1F1D60A4E2617960A1E)

* 点击Remove Read Only Response Interceptor按钮，移除之前添加的只读响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/b4/v3/ycxQlKmCSFKXmljyT3ZU-A/zh-cn_image_0000002749333128.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=35596CD0463160B50EFEBC30368611D9893C6863F1C499E63B1B40D819243B1A)

* 点击Remove Modify Request Interceptor按钮，移除之前添加的可修改请求拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3f/v3/6q-07eEWTHGEHX9QTxy5zA/zh-cn_image_0000002749493012.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=99D6D0C7FB0D61C7B42E739641D882DD34BB8AC05D42C1819791ED8FF6F62568)

* 点击Remove Modify Response Interceptor按钮，移除之前添加的可修改响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3b/v3/icFsh2vBTYO54Dm8_j1ybg/zh-cn_image_0000002779092071.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=2D0F7612E3FFF05F871CFE017611DF562CBFBADD1039ED07D75D853BDEF26675)

* 点击Remove All Read Only Response Interceptors按钮，移除组ID为1的所有只读响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/db/v3/yhMkgX6MSFWgkOD2ZpNx6g/zh-cn_image_0000002778932213.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=B25E7E3C157D62CF87226276924A1D72CD6D33460B84EEF0322DB52D770C7689)

* 点击Remove All Modify Request Interceptors按钮，移除组ID为2的所有可修改请求拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/91/v3/WRz6yJPhQbCrO49FvvnoYw/zh-cn_image_0000002749333130.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=0703884D9AA9F334CEB5297A3E9DEBA081136153AD8B8AF952EA15574D721B86)

* 点击Remove All Modify Response Interceptors按钮，移除组ID为3的所有可修改响应拦截器。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/43/v3/rUbXfleIQIuzmpSI_mqX2g/zh-cn_image_0000002749493014.png?HW-CC-KV=V1&HW-CC-Date=20260929T121703Z&HW-CC-Expire=31536000000&HW-CC-Sign=8EE1B01AC5F7DE30164CA80A4F66201CA2BB141C97B1A8054100691DC58907D6)

