网站开发按工时收费哪些网站用python做的
2026/1/3 1:45:04 网站建设 项目流程
网站开发按工时收费,哪些网站用python做的,好网站建设公司地址,宁波哪里有网站建设高端的网络请求是现代应用的核心功能。无论是获取用户数据、上传文件还是实时通信#xff0c;都需要与服务器进行网络交互。但网络请求涉及许多复杂的问题#xff1a;网络延迟、错误处理、数据缓存、离线支持等。 本文将为你讲解如何在鸿蒙应用中优雅地处理网络请求和数据#xff…网络请求是现代应用的核心功能。无论是获取用户数据、上传文件还是实时通信都需要与服务器进行网络交互。但网络请求涉及许多复杂的问题网络延迟、错误处理、数据缓存、离线支持等。本文将为你讲解如何在鸿蒙应用中优雅地处理网络请求和数据包括HTTP请求、JSON解析、错误处理、数据缓存等。通过学习这些内容你将能够构建更加健壮和高效的网络层。HTTP请求的基础实现鸿蒙提供了http模块来进行HTTP请求。基础的HTTP请求实现相对简单但要做好错误处理和超时控制。基础GET请求importhttpfromohos.net.httpasyncfunctionfetchData(url:string):Promisestring{lethttpRequesthttp.createHttpRequest()try{awaithttpRequest.request(url,{method:http.RequestMethod.GET,connectTimeout:10000,readTimeout:10000})letresulthttpRequest.getResponseBody()returnresultasstring}catch(error){console.error(Request failed:,error)throwerror}finally{httpRequest.destroy()}}POST请求和请求头asyncfunctionpostData(url:string,data:object):Promisestring{lethttpRequesthttp.createHttpRequest()try{awaithttpRequest.request(url,{method:http.RequestMethod.POST,header:{Content-Type:application/json,Authorization:Bearer token},extraData:JSON.stringify(data),connectTimeout:10000,readTimeout:10000})letresulthttpRequest.getResponseBody()returnresultasstring}catch(error){console.error(Request failed:,error)throwerror}finally{httpRequest.destroy()}}JSON数据解析从服务器获取的数据通常是JSON格式。正确的JSON解析对于数据处理至关重要。基础JSON解析interfaceUser{id:numbername:stringemail:string}asyncfunctionfetchUser(userId:number):PromiseUser{letresponseawaitfetchData(https://api.example.com/users/${userId})letuserJSON.parse(response)asUserreturnuser}处理复杂的JSON结构interfacePost{id:numbertitle:stringcontent:stringauthor:User comments:Comment[]}interfaceComment{id:numbertext:stringauthor:User}asyncfunctionfetchPost(postId:number):PromisePost{letresponseawaitfetchData(https://api.example.com/posts/${postId})letpostJSON.parse(response)asPostreturnpost}JSON序列化functionserializeUser(user:User):string{returnJSON.stringify(user)}functionserializeUsers(users:User[]):string{returnJSON.stringify(users,null,2)}错误处理和重试机制网络请求经常会失败。实现良好的错误处理和重试机制可以提高应用的稳定性。基础错误处理enumRequestError{NETWORK_ERRORNETWORK_ERROR,TIMEOUTTIMEOUT,SERVER_ERRORSERVER_ERROR,PARSE_ERRORPARSE_ERROR}classRequestExceptionextendsError{constructor(publiccode:RequestError,message:string){super(message)}}asyncfunctionfetchDataWithErrorHandling(url:string):Promisestring{try{lethttpRequesthttp.createHttpRequest()awaithttpRequest.request(url,{method:http.RequestMethod.GET,connectTimeout:10000,readTimeout:10000})letstatusCodehttpRequest.getResponseCode()if(statusCode400){thrownewRequestException(RequestError.SERVER_ERROR,Server error:${statusCode})}returnhttpRequest.getResponseBody()asstring}catch(error){if(errorinstanceofRequestException){throwerror}thrownewRequestException(RequestError.NETWORK_ERROR,Network request failed)}}重试机制asyncfunctionfetchDataWithRetry(url:string,maxRetries:number3):Promisestring{letlastError:Error|nullnullfor(leti0;imaxRetries;i){try{returnawaitfetchDataWithErrorHandling(url)}catch(error){lastErrorerrorasErrorif(imaxRetries-1){// 指数退避等待时间随着重试次数增加而增加letdelayMath.pow(2,i)*1000awaitnewPromise(resolvesetTimeout(resolve,delay))}}}throwlastError}数据缓存策略频繁的网络请求会浪费带宽和电池电量。实现合理的缓存策略可以显著提升应用性能。内存缓存classMemoryCacheT{privatecache:Mapstring,{data:T,timestamp:number}newMap()privatettl:number// 缓存过期时间毫秒constructor(ttl:number5*60*1000){this.ttlttl}set(key:string,data:T):void{this.cache.set(key,{data,timestamp:Date.now()})}get(key:string):T|null{letitemthis.cache.get(key)if(!item){returnnull}if(Date.now()-item.timestampthis.ttl){this.cache.delete(key)returnnull}returnitem.data}clear():void{this.cache.clear()}}letuserCachenewMemoryCacheUser(10*60*1000)asyncfunctionfetchUserWithCache(userId:number):PromiseUser{letcacheKeyuser_${userId}// 检查缓存letcachedUseruserCache.get(cacheKey)if(cachedUser){returncachedUser}// 从网络获取letuserawaitfetchUser(userId)// 存入缓存userCache.set(cacheKey,user)returnuser}本地存储缓存importpreferencesfromohos.data.preferencesclassPersistentCache{privatepreferences:preferences.Preferences|nullnullasyncinit(context:any):Promisevoid{this.preferencesawaitpreferences.getPreferences(context,app_cache)}asyncset(key:string,value:string):Promisevoid{if(!this.preferences){thrownewError(Cache not initialized)}awaitthis.preferences.put(key,value)awaitthis.preferences.flush()}asyncget(key:string):Promisestring|null{if(!this.preferences){thrownewError(Cache not initialized)}letvalueawaitthis.preferences.get(key,null)returnvalueasstring|null}asyncremove(key:string):Promisevoid{if(!this.preferences){thrownewError(Cache not initialized)}awaitthis.preferences.delete(key)awaitthis.preferences.flush()}}letpersistentCachenewPersistentCache()asyncfunctionfetchUserWithPersistentCache(userId:number):PromiseUser{letcacheKeyuser_${userId}// 检查本地缓存letcachedDataawaitpersistentCache.get(cacheKey)if(cachedData){returnJSON.parse(cachedData)asUser}// 从网络获取letuserawaitfetchUser(userId)// 存入本地缓存awaitpersistentCache.set(cacheKey,JSON.stringify(user))returnuser}离线支持应用应该能够在网络不可用时继续工作。实现离线支持需要合理的缓存策略和用户提示。检查网络连接importconnectionfromohos.net.connectionasyncfunctionisNetworkAvailable():Promiseboolean{try{letnetHandleawaitconnection.getDefaultNetConnection()letnetCapabilitiesawaitconnection.getNetCapabilities(netHandle)returnnetCapabilities.hasCapability(connection.NetCapsType.NET_CAPABILITY_INTERNET)}catch(error){returnfalse}}asyncfunctionfetchDataWithOfflineSupport(url:string):Promisestring{letisOnlineawaitisNetworkAvailable()if(isOnline){try{returnawaitfetchDataWithRetry(url)}catch(error){// 网络请求失败尝试使用缓存letcachedDataawaitpersistentCache.get(url)if(cachedData){console.warn(Using cached data due to network error)returncachedData}throwerror}}else{// 离线模式使用缓存letcachedDataawaitpersistentCache.get(url)if(cachedData){returncachedData}thrownewError(No network connection and no cached data available)}}最佳实践使用拦截器统一处理请求classHttpClient{privaterequestInterceptors:Array(config:any)any[]privateresponseInterceptors:Array(response:any)any[]addRequestInterceptor(interceptor:(config:any)any):void{this.requestInterceptors.push(interceptor)}addResponseInterceptor(interceptor:(response:any)any):void{this.responseInterceptors.push(interceptor)}asyncrequest(url:string,config:any{}):Promiseany{// 执行请求拦截器for(letinterceptorofthis.requestInterceptors){configinterceptor(config)}// 执行请求letresponseawaitfetchDataWithRetry(url)// 执行响应拦截器for(letinterceptorofthis.responseInterceptors){responseinterceptor(response)}returnresponse}}lethttpClientnewHttpClient()// 添加认证拦截器httpClient.addRequestInterceptor((config){config.headerconfig.header||{}config.header[Authorization]Bearer tokenreturnconfig})// 添加日志拦截器httpClient.addResponseInterceptor((response){console.log(Response:,response)returnresponse})分离数据层和UI层classUserRepository{asyncgetUser(userId:number):PromiseUser{returnawaitfetchUserWithPersistentCache(userId)}asyncgetUsers(page:number,pageSize:number):PromiseUser[]{leturlhttps://api.example.com/users?page${page}pageSize${pageSize}letresponseawaitfetchDataWithOfflineSupport(url)returnJSON.parse(response)asUser[]}}Component struct UserList{State users:User[][]State loading:booleanfalseState error:stringprivaterepositorynewUserRepository()asyncloadUsers(){this.loadingtruetry{this.usersawaitthis.repository.getUsers(1,20)}catch(error){this.error(errorasError).message}finally{this.loadingfalse}}build(){Column(){if(this.loading){LoadingProgress()}elseif(this.error){Text(this.error)}else{List(){ForEach(this.users,(user:User){ListItem(){Text(user.name)}})}}}}}总结网络请求和数据处理是应用开发的核心。通过实现良好的错误处理、缓存策略和离线支持你可以构建更加健壮和高效的应用。关键要点包括使用正确的HTTP方法和请求头实现完善的错误处理和重试机制合理使用内存缓存和本地存储缓存支持离线模式分离数据层和UI层现在就在你的项目中应用这些最佳实践吧。如果你有任何问题或想法欢迎在评论区分享。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询