当前位置:   article > 正文

鸿蒙网络请求与共享参数的封装(实例演示)cv大法即可_鸿蒙开发网络请求封装

鸿蒙开发网络请求封装

写程序最重要的就是数据了,如果没有数据那么程序将毫无意义,其中网络请求就是获得数据的方法!(初学阶段编写)

申请网络权限

在src中的main找到module.json5文件中加入以下代码申请网络请求

编写Request类用于对网络请求进行封装

新建一个utils包存放工具类

具体封装代码如下

  1. import http from '@ohos.net.http';
  2. import { Response } from '../model'
  3. import Preferences from './Preferences';
  4. //导出httpRequest请求函数
  5. export async function request(url: string, method: http.RequestMethod, Data?: any): Promise<Response> {
  6. //基地址
  7. const BASE_URL: string = "网络请求的基地址"
  8. //获取token值
  9. let token
  10. Preferences.getData('token值','token').then((value)=>{
  11. token = value
  12. })
  13. //创建http对象
  14. let httpRequest = http.createHttp()
  15. let responseResult = httpRequest.request(
  16. BASE_URL + url,//请求地址
  17. {
  18. method: method,//请求方式
  19. header: {
  20. 'Content-Type': 'application/json',
  21. 'Authorization':token//需要携带的token值
  22. },
  23. extraData: JSON.stringify(Data), //携带额外参数
  24. //可选,默认为60000ms
  25. connectTimeout: 10000, //连接超时时间
  26. readTimeout: 10000, //读取超时时间
  27. }
  28. )
  29. let response = new Response();
  30. //处理数据,并返回
  31. return responseResult.then((value: http.HttpResponse) => {
  32. if (value.responseCode === 200) {
  33. //获取返回数据,将返回的json数据解析成事先预定好的响应格式
  34. //这里建议和后端的保持一致
  35. let res: Response = JSON.parse(`${value.result}`);
  36. response.data = res.data;
  37. response.code = res.code;
  38. response.msg = res.msg;
  39. response.token = res.token
  40. } else {
  41. response.msg = '请求错误';
  42. response.code = 400;
  43. }
  44. return response;
  45. }).catch(() => {
  46. response.msg = '请求错误';
  47. response.code = 400;
  48. return response;
  49. }).finally(() => {
  50. httpRequest.destroy()
  51. });
  52. }

以上代码还缺少几个类的调用在下面我们继续进行编写

Preferences(首选项封装)

在util包下新建Preferences类进行以下代码的编写

  1. import dataPreferences from '@ohos.data.preferences';
  2. import promptAction from '@ohos.promptAction';
  3. let context = getContext(this);
  4. let preference: dataPreferences.Preferences;
  5. let preferenceTemp: dataPreferences.Preferences;
  6. class PreferenceModel {
  7. /**
  8. * 读取指定的Preferences持久性文件并将数据加载到Preferences实例中。
  9. */
  10. async getPreferencesFromStorage(db_name: string) {
  11. try {
  12. preference = await dataPreferences.getPreferences(context, db_name);
  13. } catch (err) {
  14. }
  15. }
  16. /**
  17. * 删除本地存储
  18. * 从内存中删除指定的首选项持久性文件,并删除首选项实例。
  19. */
  20. async deletePreferences(db_name: string) {
  21. try {
  22. await dataPreferences.deletePreferences(context, db_name);
  23. } catch(err) {
  24. };
  25. preference = preferenceTemp;
  26. }
  27. /**
  28. * 将数据保存到Preferences中。
  29. */
  30. async putPreference(data: any, db_name: string, key: string) {
  31. if (!preference) {
  32. await this.getPreferencesFromStorage(db_name);
  33. }
  34. // 将用户输入的键值对存入preferences
  35. try {
  36. if (typeof data === 'object' && data !== null) {
  37. await preference.put(key, JSON.stringify(data));
  38. } else {
  39. await preference.put(key, data);
  40. }
  41. } catch (err) {
  42. }
  43. await preference.flush();
  44. }
  45. /**
  46. * 取数据
  47. * 获取首选项数据。
  48. */
  49. async getPreference(db_name: string, key: string) {
  50. let storage;
  51. if (!preference) {
  52. await this.getPreferencesFromStorage(db_name);
  53. }
  54. try {
  55. storage = (await preference.get(key, ''));
  56. } catch (err) {
  57. }
  58. // 如果数据为空,则提示需要写数据。
  59. if (!storage) {
  60. return '';
  61. }
  62. return storage;
  63. }
  64. /**
  65. * write data.
  66. * 存数据
  67. * @param fruit Fruit data.
  68. */
  69. writeData(data: any, db_name: string, key: string) {
  70. //如果数据不为空,则将数据插入首选项数据库。
  71. this.putPreference(data, db_name, key);
  72. console.log(`${db_name}-${key}---writeData成功`)
  73. }
  74. /**
  75. * 处理从数据库中获取的数据。
  76. */
  77. async getData(db_name: string, key: string) {
  78. return await this.getPreference(db_name, key);
  79. }
  80. /**
  81. * 弹出窗口提示信息。
  82. *
  83. * @param message Prompt message.
  84. */
  85. showToastMessage(message: Resource) {
  86. promptAction.showToast({
  87. message: message,
  88. duration: 3000
  89. });
  90. };
  91. }
  92. export default new PreferenceModel();

请求数据类的编写

新建一个model包用于存放数据类

login类的编写(我这个类主要用于向后端发送的数据)
  1. export class Login{
  2. username:string
  3. password:string
  4. constructor(username:string,password:string) {
  5. this.username = username
  6. this.password = password
  7. }
  8. }
index.et的编写

将后端常用的数据字段封装起来

  1. export * from './login/login'
  2. export class Response{
  3. /**
  4. * 响应码
  5. */
  6. code:number
  7. /**
  8. * 提示信息
  9. */
  10. msg:string
  11. /**
  12. * token
  13. */
  14. token?:string
  15. /**
  16. * 响应数据
  17. */
  18. data:any
  19. }

api类的编写(该类主要用于存储后端详细接口)

api中的代码如下

  1. import {request} from '../../utils/request'
  2. import {Login} from '../../model'
  3. import http from '@ohos.net.http'
  4. export function login(data:Login){
  5. return request('url地址',http.RequestMethod.POST,data)
  6. }

前面的准备工作做好以后就可以进行编写pages中的代码了

index类是(首页)因为还没有进行项目的编写所以类名比较随意

  1. import router from '@ohos.router'
  2. import Preferences from '../utils/Preferences'
  3. @Entry
  4. @Component
  5. struct Page {
  6. @State message: string = 'Hello World'
  7. onPageShow() {
  8. Preferences.getData('token值', 'token').then((value) => {
  9. if (value != '') {
  10. } else {
  11. router.pushUrl({
  12. url: 'pages/Page'
  13. })
  14. return
  15. }
  16. console.log('This Page is onPageShow')
  17. })
  18. }
  19. build() {
  20. Row() {
  21. Column() {
  22. Text(this.message)
  23. .fontSize(50)
  24. .fontWeight(FontWeight.Bold)
  25. Button('点击').width('80%').height(45).onClick(() => {
  26. Preferences.getData('token值', 'token').then((value) => {
  27. this.message = value
  28. })
  29. })
  30. }
  31. .width('100%')
  32. }
  33. .height('100%')
  34. }
  35. }

page则是登录页面

  1. import { Login } from '../model'
  2. import { login } from '../api/login/login'
  3. import PreferenceModel from '../utils/Preferences'
  4. import router from '@ohos.router'
  5. /**
  6. * 登录页面
  7. */
  8. @Entry
  9. @Component
  10. struct user{
  11. @State user: Login = new Login('','')
  12. @State token:string = ''
  13. build(){
  14. Column({space: 10}){
  15. Row(){
  16. TextInput({placeholder: '请输入账号'})
  17. .type(InputType.Normal)
  18. .height(45)
  19. .backgroundColor('#ffffff')
  20. .padding(10)
  21. .layoutWeight(1)
  22. .onChange(value =>{
  23. this.user.username = value
  24. })
  25. }.padding({left: 20, right: 20})
  26. Row(){
  27. TextInput({placeholder: '请输入密码'})
  28. .type(InputType.PhoneNumber)
  29. .height(45)
  30. .backgroundColor('#ffffff')
  31. .padding({left: 0, right: 0})
  32. .layoutWeight(1)
  33. .onChange(value =>{
  34. this.user.password = value
  35. })
  36. }.padding({left: 20, right: 20})
  37. Row(){
  38. Button('登 录')
  39. .type(ButtonType.Normal)
  40. .fontSize(20)
  41. .width('100%')
  42. .borderRadius(20)
  43. .backgroundColor('#2f90b9')
  44. .fontColor('#ffffff')
  45. .onClick(() => {
  46. login(this.user).then(res =>{
  47. if (res.code === 200) {
  48. PreferenceModel.writeData(res.token,"token值",'token')
  49. router.pushUrl({
  50. url: 'pages/Index'
  51. })
  52. AlertDialog.show({
  53. title:"成功",
  54. message: PreferenceModel.getPreference("token值",'token')+''
  55. })
  56. } else {
  57. AlertDialog.show({
  58. title: '警告',
  59. message: res.msg
  60. })
  61. }
  62. })
  63. })
  64. }.padding({left: 20, right: 20})
  65. }
  66. .width('100%')
  67. .height('100%')
  68. .justifyContent(FlexAlign.Center)
  69. }
  70. }

到这里我们的实例就完成了!实现了登录并获取到token值实现了有token值不在进行登录操作!(存在一些小小的不足就是在判断有没有token时会先显示主页后在跳转)可能由于我对鸿蒙生命周期还不够了解

ps:后端接口需要直接弄哦!网上有免费的接口不会写的同学们可以去找一些实训一下

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/231906?site
推荐阅读