本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、HTTP核心模块对比

模块 特点 适用场景
@ohos.net.http 系统原生API,支持HTTP/HTTPS 常规请求、文件上传下载
@ohos.axios 第三方库(需安装),Promise风格 需要拦截器、复杂封装场景
WebSocket 双向实时通信 聊天室、实时数据推送

二、基础HTTP请求

方法 语义 典型应用场景 是否携带Body
GET 获取资源 查询数据、获取列表 ❌ 否
POST 创建资源 提交表单、新增数据 ✅ 是
PUT 完整更新资源 替换整个文档/对象 ✅ 是
PATCH 部分更新资源 修改个别字段 ✅ 是
DELETE 删除资源 移除数据记录 ❌ 可选
HEAD 获取响应头(无Body) 检查资源是否存在/变更 ❌ 否
OPTIONS 查询服务器支持的方法 跨域预检请求(CORS) ❌ 否
1. GET请求示例
import http from '@ohos.net.http';

async function fetchData() {
  // 1. 创建请求对象
  let httpRequest = http.createHttp();
  
  // 2. 设置请求参数
  let url = 'https://api.example.com/data?id=123';
  let header = { 'Content-Type': 'application/json' };
  
  // 3. 发起请求
  try {
    let response = await httpRequest.request(
      url,
      { method: 'GET', header }
    );
    
    // 4. 处理响应
    if (response.responseCode === 200) {
      console.log(JSON.parse(response.result));
    }
  } catch (err) {
    console.error(`请求失败: ${err.code}`);
  } finally {
    // 5. 销毁请求
    httpRequest.destroy();
  }
}

2. POST请求(带Body) 

let options = {
  method: 'POST',
  header: { 'Content-Type': 'application/json' },
  extraData: JSON.stringify({ title: 'foo', body: 'bar' })
};

httpRequest.request(url, options, (err, data) => {
  if (!err) {
    console.log("响应状态码:", data.responseCode);
  }
});

3. PUT请求

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

async function updateUser(userId: string, userData: object) {
  let httpRequest = http.createHttp();
  try {
    let response = await httpRequest.request(
      `https://api.example.com/users/${userId}`,
      {
        method: 'PUT', // 关键设置
        header: { 'Content-Type': 'application/json' },
        extraData: JSON.stringify(userData) // 完整用户数据
      }
    );
    console.log('更新结果:', response.result);
  } finally {
    httpRequest.destroy();
  }
}

// 调用示例
updateUser('123', { name: '张三', age: 30 });

4. PATCH 请求

async function updateUserName(userId: string, newName: string) {
  let httpRequest = http.createHttp();
  try {
    await httpRequest.request(
      `https://api.example.com/users/${userId}/name`,
      {
        method: 'PATCH', // 关键设置
        header: { 'Content-Type': 'application/json-patch+json' },
        extraData: JSON.stringify([{ "op": "replace", "path": "/name", "value": newName }])
      }
    );
  } finally {
    httpRequest.destroy();
  }
}

5. DELETE 请求

async function deletePost(postId: string) {
  let httpRequest = http.createHttp();
  try {
    let response = await httpRequest.request(
      `https://api.example.com/posts/${postId}`,
      { method: 'DELETE' } // 关键设置
    );
    if (response.responseCode === 204) {
      console.log('删除成功');
    }
  } finally {
    httpRequest.destroy();
  }
}

三、高级功能实现

1. 文件上传(Multipart)
import fileio from '@ohos.fileio';

async function uploadFile(filePath: string) {
  let fileStat = fileio.statSync(filePath);
  let file = fileio.openSync(filePath, 0o100); // 只读模式
  
  let options = {
    method: 'POST',
    files: [
      {
        filename: 'image.jpg',
        name: 'file',
        uri: `internal://app/${filePath}`,
        type: 'image/jpeg',
        size: fileStat.size
      }
    ]
  };

  httpRequest.upload(url, options, (progress) => {
    console.log(`上传进度: ${progress.percent}%`);
  });
}

2. 请求拦截器(Axios风格) 

// 安装axios:ohpm install @ohos/axios
import axios from '@ohos/axios';

// 请求拦截
axios.interceptors.request.use(config => {
  config.header['X-Token'] = getToken();
  return config;
});

// 响应拦截
axios.interceptors.response.use(
  response => {
    if (response.status !== 200) {
      throw new Error('服务异常');
    }
    return response.data;
  },
  error => {
    showToast('网络错误');
    return Promise.reject(error);
  }
);

四、安全与优化

1. HTTPS证书校验
let sslOptions = {
  protocols: [http.Protocol.TLSv12],
  useCipherSuites: [
    'TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384'
  ],
  ca: '/path/to/cert.pem' // 自定义CA证书
};

httpRequest.request(url, {
  method: 'GET',
  sslOptions
});

2. 请求缓存策略 

let cacheOptions = {
  priority: http.HttpCachePriority.LOW,
  readBehavior: http.HttpCacheReadBehavior.ONLINE
};

httpRequest.request(url, {
  method: 'GET',
  cacheOptions
});

五、实战案例:封装HTTP工具类 

export class HttpUtil {
  private static instance: HttpUtil;
  private httpRequest: http.HttpRequest;

  private constructor() {
    this.httpRequest = http.createHttp();
  }

  static getInstance(): HttpUtil {
    if (!HttpUtil.instance) {
      HttpUtil.instance = new HttpUtil();
    }
    return HttpUtil.instance;
  }

  async get(url: string, params?: Record<string, string>) {
    let query = params ? '?' + new URLSearchParams(params).toString() : '';
    return this.request('GET', url + query);
  }

  private async request(method: string, url: string, data?: any) {
    try {
      let response = await this.httpRequest.request(url, {
        method,
        header: { 'Content-Type': 'application/json' },
        extraData: data ? JSON.stringify(data) : undefined
      });
      
      return JSON.parse(response.result);
    } catch (err) {
      throw new Error(`HTTP Error: ${err.code}`);
    }
  }

  destroy() {
    this.httpRequest.destroy();
  }
}

// 使用示例
HttpUtil.getInstance().get('https://api.example.com/data', { page: 1 });

六、调试与问题排查

1. 网络状态监听
import network from '@ohos.net.network';

network.on('netAvailable', (data) => {
  console.log(`当前网络类型: ${data.netInfo.type}`);
});
2. 常见错误码处理
错误码 含义 解决方案
200 成功 正常处理响应数据
401 未授权 检查Token或重新登录
404 资源不存在 验证URL是否正确
500 服务器内部错误 联系后端排查

七、性能优化建议

  1. 连接复用

    // 全局保持单例HttpRequest
    const httpRequest = http.createHttp();
  2. 数据压缩

    let headers = {
      'Accept-Encoding': 'gzip, deflate'
    };
  3. 分页加载

    async function loadPage(page: number) {
      return httpRequest.get(url, { page, size: 20 });
    }

总结对比

方案 优势 推荐场景
原生HTTP模块 零依赖、系统级优化 基础请求、文件操作
Axios封装 拦截器、Promise链式调用 复杂业务逻辑
WebSocket 全双工通信 实时性要求高的场景

 

 

推荐内容
点击阅读全文
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐