#鸿蒙通关秘籍#如何在HarmonyOS中将远场通信RCP请求模块化封装以简化网络请求?

HarmonyOS
5h前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
hm67482d3305d0e

通过模块化的封装方式,可以在HarmonyOS中简化远场通信RCP的请求操作流程。以下是实现步骤:

  1. 定义HttpRequestConfigHttpResponse接口,确保代码的灵活性和可扩展性。
  2. 创建HttpRequestAbstract类实现基本的HTTP方法,如GETPOSTPUTDELETE。通过配置中的baseURLmethod来构建完整的请求URL,并使之成为异步请求的Promise。
  3. 使用工厂模式实例化HttpRequest对象,并通过实现函数将特定的请求封装到指定的api模块中。
  4. 在请求过程中使用拦截器进行请求和相应的过滤、修改。

实现代码如下:

import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 定义请求和响应的接口
export interface HttpRequestConfig {
  baseURL?: string;
  url?: string;
  method?: "GET" | "POST" | "PUT" | "DELETE";
  data?: Record<string, any>;
  header?: Record<string, any>;
}

export interface HttpResponse<T = any> {
  statusCode: number;
  data: T;
  header: Record<string, any>;
}

// 抽象类,用于定义HTTP请求的方法
export abstract class HttpRequestAbstract {
  session: rcp.Session;
  config: HttpRequestConfig;

  constructor(conf: HttpRequestConfig) {
    this.config = conf;
    this.session = rcp.createSession({
      baseAddress: conf.baseURL,
      headers: conf.header
    });
  }

  request<T = any>(config: HttpRequestConfig): Promise<HttpResponse<T>> {
    return new Promise((resolve, reject) => {
      const fullUrl = `${this.config.baseURL}${config.url}`;
      const req = new rcp.Request(fullUrl, config.method, config.header, config.data);
      this.session.fetch(req).then((response) => {
          resolve({
            statusCode: response.statusCode,
            data: response.toJSON() as T,
            header: response.headers
          });
        }).catch((err: BusinessError) => {
          reject(err);
        });
    });
  }

  get<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {
    return this.request({ ...config, url, method: 'GET' });
  }

  post<T = any>(url: string, data?: Record<string, any>, config?: HttpRequestConfig): Promise<HttpResponse<T>> {
    return this.request({ ...config, url, data, method: 'POST' });
  }
}

// 实例化实现类,用于具体请求的封装
export const httpClient = new HttpRequestAbstract({
  baseURL: "http://example.com/api",
});

httpClient.get('/data').then(response => {
  console.log(response.data);
}).catch(error => {
  console.error("Error:", error);
});
分享
微博
QQ
微信
回复
4h前
相关问题
使用rcp模块能力发送Get请求
923浏览 • 1回复 待解决
rcp模块能力发起post请求
1129浏览 • 1回复 待解决