当前位置:   article > 正文

鸿蒙OS开发实例:【窥探网络请求】

鸿蒙OS开发实例:【窥探网络请求】

 HarmonyOS 平台中使用网络请求,需要引入 "@ohos.net.http", 并且需要在 module.json5 文件中申请网络权限, 即 “ohos.permission.INTERNET”

本篇文章将尝试使用 @ohos.net.http 来实现网络请求

场景设定

  1. WeiBo UniDemo HuaWei : 请求顺序
  2. WeiBo1 UniDemo2 HuaWei3 : 异步/同步请求时,序号表示请求回来的顺序
  3. “开始网络请求-异步” : 开始异步请求
  4. “开始网络请求-同步” : 开始同步请求
  5. “开始网络请求-自定义方法装饰器” : 采用自定义方法装饰器进行传参,进而完成网络请求

官方网络请求案例

注意:

每次请求都必须新创建一个HTTP请求实例,即只要发起请求,必须调用createHttp方法

更多鸿蒙开发应用知识已更新qr23.cn/AKFP8k参考前往。

搜狗高速浏览器截图20240326151547.png

关于 @ohos.net.http 有三个request方法

  1. request(url: string, callback: AsyncCallback): void;

    1.1 如下“官方指南代码缩减版”使用到了这个方法

  2. request(url: string, options: HttpRequestOptions, callback: AsyncCallback): void;

    2.1 如下“官方指南代码” 使用了这个方法

  3. request(url: string, options?: HttpRequestOptions): Promise;

    3.1 将在后续实践代码中使用到

  1. // 引入包名
  2. import http from '@ohos.net.http';
  3. // 每一个httpRequest对应一个HTTP请求任务,不可复用
  4. let httpRequest = http.createHttp();
  5. // 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
  6. // 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
  7. httpRequest.on('headersReceive', (header) => {
  8. console.info('header: ' + JSON.stringify(header));
  9. });
  10. httpRequest.request(
  11. // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
  12. "EXAMPLE_URL",
  13. {
  14. method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
  15. // 开发者根据自身业务需要添加header字段
  16. header: {
  17. 'Content-Type': 'application/json'
  18. },
  19. // 当使用POST请求时此字段用于传递内容
  20. extraData: {
  21. "data": "data to send",
  22. },
  23. expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
  24. usingCache: true, // 可选,默认为true
  25. priority: 1, // 可选,默认为1
  26. connectTimeout: 60000, // 可选,默认为60000ms
  27. readTimeout: 60000, // 可选,默认为60000ms
  28. usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
  29. }, (err, data) => {
  30. if (!err) {
  31. // data.result为HTTP响应内容,可根据业务需要进行解析
  32. console.info('Result:' + JSON.stringify(data.result));
  33. console.info('code:' + JSON.stringify(data.responseCode));
  34. // data.header为HTTP响应头,可根据业务需要进行解析
  35. console.info('header:' + JSON.stringify(data.header));
  36. console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
  37. } else {
  38. console.info('error:' + JSON.stringify(err));
  39. // 取消订阅HTTP响应头事件
  40. httpRequest.off('headersReceive');
  41. // 当该请求使用完毕时,调用destroy方法主动销毁
  42. httpRequest.destroy();
  43. }
  44. }
  45. );
  1. // 引入包名
  2. import http from '@ohos.net.http';
  3. // 每一个httpRequest对应一个HTTP请求任务,不可复用
  4. let httpRequest = http.createHttp();
  5. httpRequest.request(
  6. // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
  7. "EXAMPLE_URL",
  8. (err, data) => {
  9. if (!err) {
  10. // data.result为HTTP响应内容,可根据业务需要进行解析
  11. console.info('Result:' + JSON.stringify(data.result));
  12. console.info('code:' + JSON.stringify(data.responseCode));
  13. // data.header为HTTP响应头,可根据业务需要进行解析
  14. console.info('header:' + JSON.stringify(data.header));
  15. console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
  16. } else {
  17. console.info('error:' + JSON.stringify(err));
  18. // 取消订阅HTTP响应头事件
  19. httpRequest.off('headersReceive');
  20. // 当该请求使用完毕时,调用destroy方法主动销毁
  21. httpRequest.destroy();
  22. }
  23. }
  24. );

场景布局

基础页面组件代码

考虑到实际的场景会用到网络请求加载,因此这里将发挥 [@BuilderParam] 装饰器作用,先定义基础页面

组件中定义了 @Prop netLoad:boolean 变量来控制是否展示加载动画

  1. @Component
  2. export struct BasePage {
  3. @Prop netLoad: boolean
  4. //指向一个组件
  5. @BuilderParam aB0: () => {}
  6. build(){
  7. Stack(){
  8. //为组件占位
  9. this.aB0()
  10. if (this.netLoad) {
  11. LoadingProgress()
  12. .width(px2vp(150))
  13. .height(px2vp(150))
  14. .color(Color.Blue)
  15. }
  16. }.hitTestBehavior(HitTestMode.None)
  17. }
  18. }

主页面布局代码

  1. import { BasePage } from './BasePage'
  2. @Entry
  3. @Component
  4. struct NetIndex {
  5. @State netLoad: number = 0
  6. @State msg: string = ''
  7. build() {
  8. Stack(){
  9. BasePage({netLoad: this.netLoad != 0}) {
  10. Column( {space: 20} ){
  11. Row({space: 20}){
  12. Text('WeiBo').fontColor(Color.Black)
  13. Text('UniDemo').fontColor(Color.Black)
  14. Text('HuaWei').fontColor(Color.Black)
  15. }
  16. Row({space: 20}){
  17. Text('WeiBo' + this.weiboIndex)
  18. Text('UniDemo' + this.uniIndex)
  19. Text('HuaWei' + this.huaweiIndex)
  20. }
  21. Button('开始网络请求 - 异步').fontSize(20).onClick( () => {
  22. ...
  23. })
  24. Button('开始网络请求 - 同步').fontSize(20).onClick( () => {
  25. ...
  26. })
  27. Button('开始网络请求-自定义方法装饰器').fontSize(20).onClick( () => {
  28. ...
  29. })
  30. Scroll() {
  31. Text(this.msg).width('100%')
  32. }
  33. .scrollable(ScrollDirection.Vertical)
  34. }
  35. .width('100%')
  36. .height('100%')
  37. .padding({top: px2vp(120)})
  38. }
  39. }
  40. }
  41. }

简单装封装网络请求

函数传参,直接调用封装方法

WeiBo为数据结构体,暂时不用关心,后续会贴出完整代码,这里仅仅是演示网络请求用法

  1. //引用封装好的HNet网络工具类
  2. import HNet from './util/HNet'
  3. @State msg: string = ''
  4. getWeiBoData(){
  5. HNet.get<WeiBo>({
  6. url: 'https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188',
  7. }).then( (r) => {
  8. this.msg = ''
  9. if(r.code == 0 && r.result){
  10. r.result.data.statuses.forEach((value: WeiBoItem) => {
  11. this.msg = this.msg.concat(value.created_at + ' ' + value.id + '\n')
  12. })
  13. } else {
  14. this.msg = r.code + ' ' + r.msg
  15. }
  16. console.log('顺序-weibo-' + (new Date().getTime() - starTime))
  17. this.netLoad--
  18. })
  19. }

自定义方法装饰器,完成传参调用

网络请求样例

  1. NetController.getWeiBo<WeiBo>().then( r => {
  2. ......
  3. })

按照业务定义传参

  1. import { Get, NetResponse } from './util/HNet'
  2. export default class BizNetController {
  3. @Get('https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188')
  4. static getWeiBo<WeiBo>(): Promise<NetResponse<WeiBo>>{ return }
  5. }

封装的网络请求代码

  1. import http from '@ohos.net.http';
  2. //自定义网络请求参数对象
  3. class NetParams{
  4. url: string
  5. extraData?: JSON
  6. }
  7. //自定义数据公共结构体
  8. export class NetResponse<T> {
  9. result: T
  10. code: number
  11. msg: string
  12. }
  13. //网络封装工具类
  14. class HNet {
  15. //POST 请求方法
  16. static post<T>(options: NetParams): Promise<NetResponse<T>>{
  17. return this.request(options, http.RequestMethod.POST)
  18. }
  19. //GET 请求方法
  20. static get<T>(options: NetParams): Promise<NetResponse<T>>{
  21. return this.request(options, http.RequestMethod.GET)
  22. }
  23. private static request<T>(options: NetParams, method: http.RequestMethod): Promise<NetResponse<T>>{
  24. let r = http.createHttp()
  25. return r.request(options.url, {
  26. method: method,
  27. extraData: options.extraData != null ? JSON.stringify(options.extraData) : null
  28. }).then( (response: http.HttpResponse) => {
  29. let netResponse = new NetResponse<T>()
  30. let dataType = typeof response.result
  31. if(dataType === 'string'){
  32. console.log('结果为字符串类型')
  33. }
  34. if(response.responseCode == 200){
  35. netResponse.code = 0
  36. netResponse.msg = 'success'
  37. netResponse.result = JSON.parse(response.result as string)
  38. } else {
  39. //出错
  40. netResponse.code = -1
  41. netResponse.msg = 'error'
  42. }
  43. return netResponse
  44. }).catch( reject => {
  45. console.log('结果发生错误')
  46. let netResponse = new NetResponse<T>()
  47. netResponse.code = reject.code
  48. netResponse.msg = reject.message
  49. return netResponse
  50. }).finally( () => {
  51. //网络请求完成后,需要进行销毁
  52. r.destroy()
  53. })
  54. }
  55. }
  56. export default HNet
  57. //用于装饰器传参
  58. export function Get(targetUrl: string) : MethodDecorator {
  59. return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
  60. //替换方法
  61. descriptor.value = () => {
  62. let options = new NetParams()
  63. options.url = targetUrl
  64. return HNet.get(options)
  65. }
  66. }
  67. }

完整代码

代码结构

net/BasePage.ets

net/NetRequest.ets

net/util/HNet.ts

net/viewmodel/WeiBoModel.ts

net/BizNetController.ets

详细代码

  1. @Component
  2. export struct BasePage {
  3. @Prop netLoad: boolean
  4. @BuilderParam aB0: () => {}
  5. build(){
  6. Stack(){
  7. this.aB0()
  8. if (this.netLoad) {
  9. LoadingProgress()
  10. .width(px2vp(150))
  11. .height(px2vp(150))
  12. .color(Color.Blue)
  13. }
  14. }.hitTestBehavior(HitTestMode.None)
  15. }
  16. }
  1. import HNet from './util/HNet'
  2. import NetController from './BizNetController'
  3. import { WeiBo, WeiBoItem } from './viewmodel/WeiBoModel'
  4. import { BasePage } from './BasePage'
  5. @Entry
  6. @Component
  7. struct NetIndex {
  8. @State netLoad: number = 0
  9. @State msg: string = ''
  10. @State weiboColor: Color = Color.Black
  11. @State uniColor: Color = Color.Black
  12. @State huaweiColor: Color = Color.Black
  13. @State weiboIndex: number = 1
  14. @State uniIndex: number = 2
  15. @State huaweiIndex: number = 3
  16. private TEST_Target_URL: string[] = [
  17. 'https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188',
  18. 'https://unidemo.dcloud.net.cn/api/news',
  19. 'https://developer.huawei.com/config/cn/head.json',
  20. ]
  21. build() {
  22. Stack(){
  23. BasePage({netLoad: this.netLoad != 0}) {
  24. Column( {space: 20} ){
  25. Row({space: 20}){
  26. Text('WeiBo').fontColor(Color.Black)
  27. Text('UniDemo').fontColor(Color.Black)
  28. Text('HuaWei').fontColor(Color.Black)
  29. }
  30. Row({space: 20}){
  31. Text('WeiBo' + this.weiboIndex).fontColor(this.weiboColor)
  32. Text('UniDemo' + this.uniIndex).fontColor(this.uniColor)
  33. Text('HuaWei' + this.huaweiIndex).fontColor(this.huaweiColor)
  34. }
  35. Button('开始网络请求 - 异步').fontSize(20).onClick( () => {
  36. this.weiboColor = Color.Black
  37. this.uniColor = Color.Black
  38. this.huaweiColor = Color.Black
  39. this.weiboIndex = 1
  40. this.uniIndex = 2
  41. this.huaweiIndex = 3
  42. this.asyncGetData()
  43. })
  44. Button('开始网络请求 - 同步').fontSize(20).onClick( () => {
  45. this.weiboColor = Color.Black
  46. this.uniColor = Color.Black
  47. this.huaweiColor = Color.Black
  48. this.weiboIndex = 1
  49. this.uniIndex = 2
  50. this.huaweiIndex = 3
  51. this.syncGetData()
  52. })
  53. Button('开始网络请求-自定义方法装饰器').fontSize(20).onClick( () => {
  54. this.getWeiBoListByController()
  55. })
  56. Scroll() {
  57. Text(this.msg).width('100%')
  58. }
  59. .scrollable(ScrollDirection.Vertical)
  60. }
  61. .width('100%')
  62. .height('100%')
  63. .padding({top: px2vp(120)})
  64. }
  65. }
  66. }
  67. asyncGetData(){
  68. this.netLoad = 3;
  69. this.TEST_Target_URL.forEach( (value) => {
  70. HNet.get({
  71. url: value,
  72. }).then( (r) => {
  73. this.msg = JSON.stringify(r)
  74. if(value.indexOf('weibo') != -1){
  75. this.weiboColor = Color.Green
  76. this.weiboIndex = 3 - this.netLoad + 1
  77. } else if(value.indexOf('unidemo') != -1){
  78. this.uniColor = Color.Green
  79. this.uniIndex = 3 - this.netLoad + 1
  80. } else if(value.indexOf('huawei') != -1){
  81. this.huaweiColor = Color.Green
  82. this.huaweiIndex = 3 - this.netLoad + 1
  83. }
  84. this.netLoad--
  85. })
  86. })
  87. }
  88. async syncGetData() {
  89. let starTime
  90. let url
  91. this.netLoad = 3;
  92. starTime = new Date().getTime()
  93. url = this.TEST_Target_URL[0]
  94. starTime = new Date().getTime()
  95. if(url.indexOf('weibo') != -1){
  96. console.log('顺序-请求-weibo')
  97. } else if(url.indexOf('unidemo') != -1){
  98. console.log('顺序-请求-unidemo')
  99. } else if(url.indexOf('huawei') != -1){
  100. console.log('顺序-请求-huawei')
  101. }
  102. await HNet.get<WeiBo>({
  103. url: url,
  104. }).then( (r) => {
  105. this.msg = ''
  106. if(r.code == 0 && r.result){
  107. r.result.data.statuses.forEach((value: WeiBoItem) => {
  108. this.msg = this.msg.concat(value.created_at + ' ' + value.id + '\n')
  109. })
  110. } else {
  111. this.msg = r.code + ' ' + r.msg
  112. }
  113. if(url.indexOf('weibo') != -1){
  114. this.weiboColor = Color.Green
  115. this.weiboIndex = 3 - this.netLoad + 1
  116. console.log('顺序-返回-weibo-' + (new Date().getTime() - starTime))
  117. } else if(url.indexOf('unidemo') != -1){
  118. this.uniColor = Color.Green
  119. this.uniIndex = 3 - this.netLoad + 1
  120. console.log('顺序-返回-unidemo-' + (new Date().getTime() - starTime))
  121. } else if(url.indexOf('huawei') != -1){
  122. this.huaweiColor = Color.Green
  123. this.huaweiIndex = 3 - this.netLoad + 1
  124. console.log('顺序-返回-huawei-' + (new Date().getTime() - starTime))
  125. }
  126. this.netLoad--
  127. })
  128. starTime = new Date().getTime()
  129. url = this.TEST_Target_URL[1]
  130. starTime = new Date().getTime()
  131. if(url.indexOf('weibo') != -1){
  132. console.log('顺序-请求-weibo')
  133. } else if(url.indexOf('unidemo') != -1){
  134. console.log('顺序-请求-unidemo')
  135. } else if(url.indexOf('huawei') != -1){
  136. console.log('顺序-请求-huawei')
  137. }
  138. await HNet.get({
  139. url: url,
  140. }).then( (r) => {
  141. this.msg = JSON.stringify(r)
  142. if(url.indexOf('weibo') != -1){
  143. this.weiboColor = Color.Green
  144. this.weiboIndex = 3 - this.netLoad + 1
  145. console.log('顺序-返回-weibo-' + (new Date().getTime() - starTime))
  146. } else if(url.indexOf('unidemo') != -1){
  147. this.uniColor = Color.Green
  148. this.uniIndex = 3 - this.netLoad + 1
  149. console.log('顺序-返回-unidemo-' + (new Date().getTime() - starTime))
  150. } else if(url.indexOf('huawei') != -1){
  151. this.huaweiColor = Color.Green
  152. this.huaweiIndex = 3 - this.netLoad + 1
  153. console.log('顺序-返回-huawei-' + (new Date().getTime() - starTime))
  154. }
  155. this.netLoad--
  156. })
  157. starTime = new Date().getTime()
  158. url = this.TEST_Target_URL[2]
  159. starTime = new Date().getTime()
  160. if(url.indexOf('weibo') != -1){
  161. console.log('顺序-请求-weibo')
  162. } else if(url.indexOf('unidemo') != -1){
  163. console.log('顺序-请求-unidemo')
  164. } else if(url.indexOf('huawei') != -1){
  165. console.log('顺序-请求-huawei')
  166. }
  167. await HNet.get({
  168. url: url,
  169. }).then( (r) => {
  170. this.msg = JSON.stringify(r)
  171. if(url.indexOf('weibo') != -1){
  172. this.weiboColor = Color.Green
  173. this.weiboIndex = 3 - this.netLoad + 1
  174. console.log('顺序-返回-weibo-' + (new Date().getTime() - starTime))
  175. } else if(url.indexOf('unidemo') != -1){
  176. this.uniColor = Color.Green
  177. this.uniIndex = 3 - this.netLoad + 1
  178. console.log('顺序-返回-unidemo-' + (new Date().getTime() - starTime))
  179. } else if(url.indexOf('huawei') != -1){
  180. this.huaweiColor = Color.Green
  181. this.huaweiIndex = 3 - this.netLoad + 1
  182. console.log('顺序-返回-huawei-' + (new Date().getTime() - starTime))
  183. }
  184. this.netLoad--
  185. })
  186. }
  187. getHuaWeiSomeDataByNet(){
  188. this.netLoad = 1
  189. let starTime = new Date().getTime()
  190. console.log('顺序-huawei-请求' + starTime)
  191. HNet.get({
  192. url: 'https://developer.huawei.com/config/cn/head.json',
  193. }).then( (r) => {
  194. this.msg = JSON.stringify(r, null, '\t')
  195. this.netLoad--
  196. console.log('顺序-huawei-' + (new Date().getTime() - starTime))
  197. })
  198. }
  199. getWeiBoListByHNet(){
  200. this.netLoad = 1
  201. let starTime = new Date().getTime()
  202. console.log('顺序-weibo-请求' + starTime)
  203. HNet.get<WeiBo>({
  204. url: 'https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188',
  205. }).then( (r) => {
  206. this.msg = ''
  207. if(r.code == 0 && r.result){
  208. r.result.data.statuses.forEach((value: WeiBoItem) => {
  209. this.msg = this.msg.concat(value.created_at + ' ' + value.id + '\n')
  210. })
  211. } else {
  212. this.msg = r.code + ' ' + r.msg
  213. }
  214. console.log('顺序-weibo-' + (new Date().getTime() - starTime))
  215. this.netLoad--
  216. })
  217. }
  218. getWeiBoListByController(){
  219. this.netLoad = 1
  220. NetController.getWeiBo<WeiBo>().then( r => {
  221. this.msg = ''
  222. if(r.code == 0 && r.result){
  223. r.result.data.statuses.forEach((value: WeiBoItem) => {
  224. this.msg = this.msg.concat(value.created_at + ' ' + value.id + '\n' + value.source + '\n')
  225. })
  226. } else {
  227. this.msg = r.code + ' ' + r.msg
  228. }
  229. this.netLoad--
  230. })
  231. }
  232. }
  233. import { Get, NetResponse } from './util/HNet'
  234. export default class BizNetController {
  235. @Get('https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188')
  236. static getWeiBo<WeiBo>(): Promise<NetResponse<WeiBo>>{ return }
  237. }
  238. import http from '@ohos.net.http';
  239. class NetParams{
  240. url: string
  241. extraData?: JSON
  242. }
  243. export class NetResponse<T> {
  244. result: T
  245. code: number
  246. msg: string
  247. }
  248. class HNet {
  249. static post<T>(options: NetParams): Promise<NetResponse<T>>{
  250. return this.request(options, http.RequestMethod.POST)
  251. }
  252. static get<T>(options: NetParams): Promise<NetResponse<T>>{
  253. return this.request(options, http.RequestMethod.GET)
  254. }
  255. private static request<T>(options: NetParams, method: http.RequestMethod): Promise<NetResponse<T>>{
  256. let r = http.createHttp()
  257. return r.request(options.url, {
  258. method: method,
  259. extraData: options.extraData != null ? JSON.stringify(options.extraData) : null
  260. }).then( (response: http.HttpResponse) => {
  261. let netResponse = new NetResponse<T>()
  262. let dataType = typeof response.result
  263. if(dataType === 'string'){
  264. console.log('结果为字符串类型')
  265. }
  266. if(response.responseCode == 200){
  267. netResponse.code = 0
  268. netResponse.msg = 'success'
  269. netResponse.result = JSON.parse(response.result as string)
  270. } else {
  271. //出错
  272. netResponse.code = -1
  273. netResponse.msg = 'error'
  274. }
  275. return netResponse
  276. }).catch( reject => {
  277. console.log('结果发生错误')
  278. let netResponse = new NetResponse<T>()
  279. netResponse.code = reject.code
  280. netResponse.msg = reject.message
  281. return netResponse
  282. }).finally( () => {
  283. r.destroy()
  284. })
  285. }
  286. }
  287. export default HNet
  288. export function Get(targetUrl: string) : MethodDecorator {
  289. return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
  290. //替换方法
  291. descriptor.value = () => {
  292. let options = new NetParams()
  293. options.url = targetUrl
  294. return HNet.get(options)
  295. }
  296. }
  297. }
  298. export class WeiBo{
  299. ok: number
  300. http_code: number
  301. data: WeiBoDataObj
  302. }
  303. export class WeiBoDataObj{
  304. total_number: number
  305. interval: number
  306. remind_text: string
  307. page: number
  308. statuses: Array<WeiBoItem>
  309. }
  310. export class WeiBoItem{
  311. created_at: string
  312. id: string
  313. source: string
  314. textLength: number
  315. }

最后呢,很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

高清完整版请点击《鸿蒙NEXT星河版开发学习文档》

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细资料鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,帮助大家在技术的道路上更进一步。

《鸿蒙 (OpenHarmony)开发学习视频》

图片

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

OpenHarmony北向、南向开发环境搭建

图片

《鸿蒙开发基础》

  1. ArkTS语言

  2. 安装DevEco Studio

  3. 运用你的第一个ArkTS应用

  4. ArkUI声明式UI开发

  5. .……

图片

《鸿蒙开发进阶》

  1. Stage模型入门

  2. 网络管理

  3. 数据管理

  4. 电话服务

  5. 分布式应用开发

  6. 通知与窗口管理

  7. 多媒体技术

  8. 安全技能

  9. 任务管理

  10. WebGL

  11. 国际化开发

  12. 应用测试

  13. DFX面向未来设计

  14. 鸿蒙系统移植和裁剪定制

  15. ……

图片

《鸿蒙开发实战》

  1. ArkTS实践

  2. UIAbility应用

  3. 网络案例

  4. ……

图片

 获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行!

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

闽ICP备14008679号