HarmonyOS 鸿蒙Next封装 HTTP 请求类

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next封装 HTTP 请求类
<markdown _ngcontent-xew-c237="" class="markdownPreContainer">

import { http } from ‘@kit.NetworkKit’ import { promptAction } from ‘@kit.ArkUI’

// 所有接口返回数据的类型 export interface iResponseModel { /**

  • 请求成功10000标志

/ code: number; /*

  • 返回数据

/ data: T; /*

  • 请求成功

/ message: string; /*

  • 请求成功标志

*/ success: boolean; }

const baseUrl: string = 'https://api-harmony-teach.itheima.net/hm/' // url的基地址

export class HdHttp { // 静态的 get泛型方法 // get('getclock') 带参数调用:get('clockinInfo?year=2024&month=4') static async get(url: string) { try { // 2.0 发请求 const httpRequest = http.createHttp()

  url = baseUrl + url

// 获取token // 获取token,判断如果有token,则传,否则不传 let user = AppStorage.get(‘user’) as string;

let res = await httpRequest.request(url, { method: http.RequestMethod.GET, header: { ‘Authorization’: user }, expectDataType: http.HttpDataType.OBJECT })

// 响应 // 判断如果响应code为401则提示用户token失效,直接跳转到登录页面让用户重新登录 let resData = res.result as iResponseModel<T> return resData } catch (err) { promptAction.showToast({ message: ‘get网络错误’ }) return Promise.reject(err) // 如果报错则将错误返回 } <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

}

// 静态的post泛型方法 // url: 请求url地址 // extraData:post请求体的参数,因为不是每个url都要求传递,所以定义为可选参数 /* 封装思路: 固定代码写死,可变的地方提炼成参数供外部调用的时候传入

  • */ static async post(url: string, extraData?: Object) { try { // 创建http对象 const httpRequest = http.createHttp()

    // 完整拼接url地址 url = baseUrl + url

    // 设置请求参数 let options: http.HttpRequestOptions = { method: http.RequestMethod.POST, header: { "Content-Type": 'application/json' }, expectDataType: http.HttpDataType.OBJECT // http模块底层将服务器响应回来的json字符串自动调用JSON.parse转成对象 } // 判断如果extraData有值,则向options对象增加一个extraData的属性 if (extraData) { options.extraData = extraData } // 获取token,判断如果有token,则传,否则不传 let user = AppStorage.get('user') as string; if (user && options.header) { options.header['Authorization'] = Bearer ${user} } // 调用reqeust方法并且指定相应的参数 let res = await httpRequest.request(url, options)

    // 响应服务器的数据 // 由于不同的接口返回的数据类型不一样,所以此方法应该用一个泛型来替代,将来实际运行的时候是什么类型就返回什么类型 // 判断如果响应code为401则提示用户token失效,直接跳转到登录页面让用户重新登录 let resData = res.result as iResponseModel return resData

} catch (err) {
  promptAction.showToast({ message: 'post网络错误' })
  return Promise.reject(err) // 如果报错则将错误返回
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

} }

</markdown>

关于HarmonyOS 鸿蒙Next封装 HTTP 请求类的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。
6 回复

升级HarmonyOS后,感觉手机的整体性能都有了很大的提升。

import { http } from '@kit.NetworkKit'
import { promptAction } from '@kit.ArkUI'

// 所有接口返回数据的类型 export interface iResponseModel<T> { /**

  • 请求成功10000标志 / code: number; /*
  • 返回数据 / data: T; /*
  • 请求成功 / message: string; /*
  • 请求成功标志 */ success: boolean; }

const baseUrl: string = https://api-harmony-teach.itheima.net/hm/ // url的基地址

export class HdHttp { // 静态的 get泛型方法 // get<t>(‘getclock’) 带参数调用:get<t>(‘clockinInfo?year=2024&month=4’) static async get<T>(url: string) { try { // 2.0 发请求 const httpRequest = http.createHttp()

  url = baseUrl + url

  <span class="hljs-comment"><span class="hljs-comment">// 获取token</span></span>
  <span class="hljs-comment"><span class="hljs-comment">// 获取token,判断如果有token,则传,否则不传</span></span>
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> user = AppStorage.get(<span class="hljs-string"><span class="hljs-string">'user'</span></span>) as string;

  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> res = await httpRequest.request(url, {
    method: http.RequestMethod.GET,
    header: {
      <span class="hljs-string"><span class="hljs-string">'Authorization'</span></span>: user
    },
    expectDataType: http.HttpDataType.OBJECT
  })

  <span class="hljs-comment"><span class="hljs-comment">//  响应</span></span>
  <span class="hljs-comment"><span class="hljs-comment">// 判断如果响应code为401则提示用户token失效,直接跳转到登录页面让用户重新登录</span></span>
  <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> resData = res.result as iResponseModel&lt;T&gt;
  <span class="hljs-keyword"><span class="hljs-keyword">return</span></span> resData
} <span class="hljs-keyword"><span class="hljs-keyword">catch</span></span> (err) {
  promptAction.showToast({ message: <span class="hljs-string"><span class="hljs-string">'get网络错误'</span></span> })
  <span class="hljs-keyword"><span class="hljs-keyword">return</span></span> Promise.reject(err) <span class="hljs-comment"><span class="hljs-comment">// 如果报错则将错误返回</span></span>
}

}

// 静态的post泛型方法 // url: 请求url地址 // extraData:post请求体的参数,因为不是每个url都要求传递,所以定义为可选参数 /* 封装思路: 固定代码写死,可变的地方提炼成参数供外部调用的时候传入

  • */ static async post<T>(url: string, extraData?: Object) { try {

    // 创建http对象 const httpRequest = http.createHttp()

    // 完整拼接url地址 url = baseUrl + url

    // 设置请求参数 let options: http.HttpRequestOptions = { method: http.RequestMethod.POST, header: { “Content-Type”: ‘application/json’ }, expectDataType: http.HttpDataType.OBJECT // http模块底层将服务器响应回来的json字符串自动调用JSON.parse转成对象 } // 判断如果extraData有值,则向options对象增加一个extraData的属性 if (extraData) { options.extraData = extraData } // 获取token,判断如果有token,则传,否则不传 let user = AppStorage.get(‘user’) as string; if (user && options.header) { options.header[‘Authorization’] = Bearer ${user} } // 调用reqeust方法并且指定相应的参数 let res = await httpRequest.request(url, options)

    // 响应服务器的数据 // 由于不同的接口返回的数据类型不一样,所以此方法应该用一个泛型来替代,将来实际运行的时候是什么类型就返回什么类型 // 判断如果响应code为401则提示用户token失效,直接跳转到登录页面让用户重新登录 let resData = res.result as iResponseModel<T> return resData } catch (err) { promptAction.showToast({ message: ‘post网络错误’ }) return Promise.reject(err) // 如果报错则将错误返回 } } } <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

找HarmonyOS工作还需要会Flutter技术的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

大佬,请问封装了http请求之后,我该如何在外部调用呢?如果我想调用get方法,以下这种方法是不是缺少泛型T?

HdHttp.get(url)<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

谢谢大佬,我知道了,在外部调用要这样写: HdHttp.get<object>(url) HdHttp.get<string>(url) … 根据后端返回的数据,决定尖括号里面的数据类型

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

回到顶部