当前位置: 首页 > news >正文

西安北郊网站维护运营如何创建企业邮箱

西安北郊网站维护运营,如何创建企业邮箱,wordpress纯代码生成海报功能,中国国际进口博览会上海NetWorkSdkKotlin 目录 demo案例项目介绍 maven 配置依赖引入域名#xff0c;intercept#xff0c;factory配置解析服务器提供的json自定义BaseBean解析data里面的数据#xff0c;统一错误处理#xff0c;回传业务层成功与失败提供的请求方法#xff08;针对PHP不安规定…NetWorkSdkKotlin 目录 demo案例项目介绍 maven 配置依赖引入域名interceptfactory配置解析服务器提供的json自定义BaseBean解析data里面的数据统一错误处理回传业务层成功与失败提供的请求方法针对PHP不安规定返回错误的对象处理比如我要对象PHP给数组flow方式的拿到结果自定义Api 站在巨人的肩膀上 以下介绍只能讲个大概建议跑Demo我更多的希望各位开发者可以自定义修改此库来。因为加密解密以及配置Content-Type各自需求不同。gitHub喜欢再点个start demo案例 /*** date 创建时间: 2023/7/25* auther gxx* description 发起网络请求**/fun readBanner(){viewModelScope.launch{val map mutableMapOfString,Any()map[userId] 1WanAndroidMAFRequest.getRequest(banner/json,map,object :DataParseSuFaCallMutableListBanner() {override fun onRequestDataSuccess(data: MutableListBanner?) {super.onRequestDataSuccess(data)if(BuildConfig.DEBUG){Log.d(TAG, json ${Gson().toJson(data)});Log.d(TAG, 是否主线程 ${Looper.getMainLooper() Looper.myLooper()});}}})}}项目介绍 maven 配置 maven { url https://jitpack.io }依赖引入 dependencies {// Kotlinimplementation androidx.lifecycle:lifecycle-livedata-ktx:2.5.1implementation androidx.lifecycle:lifecycle-runtime-ktx:2.4.0//okhttpimplementation com.squareup.okhttp3:okhttp:4.11.0implementation com.squareup.okhttp3:logging-interceptor:4.11.0// Retrofit 库build.gradle.ktsimplementation com.squareup.retrofit2:retrofit:2.9.0implementation com.squareup.retrofit2:converter-gson:2.9.0implementation com.google.code.gson:gson:2.9.0// Kotlin 协程库implementation org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2implementation org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2implementation com.github.CMzhizhe:Retrofit-FlowCallAdapterFactory:v1.0.0//如果自己不设计到加密解密可以加上下面这个implementation com.github.CMzhizhe:NetWorkSdkKotlin:v1.0.5 }域名interceptfactory配置 object WanAndroidMAFRequest : OnBaseApiServiceListener {//配置域名val REQUEST_URL_FIRST https://www.wanandroid.com/val mMobileRequest: MobileRequest MobileRequest(this, ServiceDataTransform())val mOkHttpManager: OkHttpManager OkHttpManager.Builder().setRequestUrl(REQUEST_URL_FIRST) //必选如果默认端口是80 或者 443 就不用额外添加.setIsDebug(BuildConfig.DEBUG) //可选.setOnFactoryListener(FactoryImpl()) //可选默认已配置GsonFactory FlowFactory.setOnInterceptorListener(InterceptImpl()) //可选.build()//自定义错误factory的构建后面会介绍这块配置val mErrorHandlerFactory ErrorHandlerFactory().addErrorHandler(LoginErrorHandler()).addErrorHandler(PayErrorHandler()).addErrorHandler(TokenErrorHandler()).addErrorHandler(UnErrorHandler()).init()override fun onGetBaseApiService(): BaseApiService? {return mOkHttpManager.getApi(REQUEST_URL_FIRST,BaseApiService::class.java)} }这里有其他想说的底层里面已经配置了GsonFactory、FlowFactory类型的转换。为啥我要说单独处理对于80或者443端口的呢目的是为了有其他开发者直接修改此库比如加密、解密的interceptor。域名A的加密/解密跟域名B的不同密匙不同此时就需要开发者自己去根据域名获取密匙。以下是伪代码 class OkHttpManager {companion object{private val mCatchMapRetrofit mutableMapOfString, Retrofit()//存储OkHttpManagerkey为baseUrlprivate val mObj Any()val mSecreKey mutableMapOfString, String()//key为baseUrlvalue为密匙 key类似http://www.baidu.com/} }//加密 class EncryptionInterceptor : Interceptor {override fun intercept(chain: Interceptor.Chain): Response {val request builder.build()val httpUrl request.urlhttpUrl.host //www.baidu.comhttpUrl.port//9999httpUrl.scheme//http//http://www.baidu.com:9999/val port HttpUrl.defaultPort(httpUrl.scheme)var url if (port 80 || port 443) {url ${httpUrl.scheme}://${httpUrl.host}/} else {url ${httpUrl.scheme}://${httpUrl.host}:${httpUrl.port}/}val secreKey OkHttpManager.mSecreKey[url]//TODO 加密return chain.proceed(builder.build())} }解析服务器提供的json 需要自己new 一个类去实现 OnResponseBodyTransformJsonListener class ServiceDataTransform : OnResponseBodyTransformJsonListener {companion object {const val ERROR_CODE errorCodeconst val DATA dataconst val ERROR_CODE_TYPE_0 0//与服务器协商的正常状态const val ERROR_CODE_TYPE_101 101//与服务器协商错误的逻辑const val ERROR_CODE_TYPE_102 102//与服务器协商错误的逻辑const val ERROR_CODE_TYPE_103 103//与服务器协商错误的逻辑}override fun onResponseBodyTransformJson(method: String,jsString: String): OnIParserListener {val baseBean: BaseBeanif (JsonParser.parseString(jsString).isJsonObject) {//服务器提供的是jsonObjectval jsonObject JsonParser.parseString(jsString).asJsonObjectval errorCode jsonObject.get(ERROR_CODE).asIntbaseBean if (errorCode.toString() ERROR_CODE_TYPE_0) {if (jsonObject.get(DATA).isJsonArray) {BaseBean(method, jsString, jsonObject.getAsJsonArray(DATA), errorCode)} else {BaseBean(method, jsString, jsonObject.getAsJsonObject(DATA), errorCode)}} else {//与服务器协商的异常逻辑// 可以在这里抛异常if (errorCode.toString() ERROR_CODE_TYPE_101) {throw LoginApiException(errorCode.toString(), jsString, 登陆的异常)} else if (errorCode.toString() ERROR_CODE_TYPE_102) {throw PayApiException(errorCode.toString(), jsString, 支付的异常)} else if (errorCode.toString() ERROR_CODE_TYPE_103) {throw TokenApiException(errorCode.toString(), jsString, token的异常)} else {throw UnApiException(errorCode.toString(), jsString, 未跟服务器定义的异常)}}} else {baseBean BaseBean(method, jsString, null, -1)}return baseBean} }在这里我有定义我跟服务器之间的异常处理这里进行异常抛出在最终的onRequestFail拿到错误丢给对应的Handler进行处理 自定义BaseBean 自己创建一个class文件去实现OnIParserListener接口 {errorCode:0data:{}msg:ok } class BaseBean( var resourceJsonString: String? null,var jsonElement: JsonElement? null,var errorCode:Int) : OnIParserListener {//这里是获取data里面的 JsonElementoverride fun resultDataJsonElement(): JsonElement? {return jsonElement}//这个是整个服务器提供的json格式override fun sourceJsonString(): String? {return resourceJsonString;}//这里是决定是否服务器返回的正常数据override fun isSuccess(): Boolean {return errorCode 0} }解析data里面的数据统一错误处理回传业务层成功与失败 我们在发起网络请求的时候是这样的new DataParseSuFaCall 传递需要的具体格式 viewModelScope.launch{val map mutableMapOfString,Any()map[userId] 1WanAndroidMAFRequest.getRequest(banner/json,map,object :DataParseSuFaCallMutableListBanner() {override fun onRequestDataSuccess(data: MutableListBanner?) {//成功回调super.onRequestDataSuccess(data)}override fun onRequestBaseBeanFail(baseBean: BaseBean?) {//失败回调super.onRequestBaseBeanFail(baseBean)}})}/*** date 创建时间: 2023/7/22* auther gaoxiaoxiong* description 服务器数据处理**/ open class DataParseSuFaCallT : AbsRequestResultImpl() {/*** date 创建时间: 2023/7/23* auther gaoxiaoxiong* description 成功结果回调**/override fun onRequestSuccess(method: String,targetElement: JsonElement?,onIParserListener: OnIParserListener) {if (targetElement!null){var result:Any?nulltry {val parameterizedType this::class.java.genericSuperclass as ParameterizedTypeval subType parameterizedType.actualTypeArguments.first() //获取泛型Tval adapter: JsonAdapterAny MoshiUtil.moshi.adapter(subType)result adapter.fromJson(targetElement.toString())} catch (e: Exception) {e.printStackTrace()//处理解析异常onRequestFail(e,,解析异常, null,onIParserListener)}onRequestDataSuccess(if (result null) null else result as T)onRequestBaseBeanSuccess(if (result null) null else result as T,onIParserListener as BaseBean)}else{onRequestDataSuccess(null)onRequestBaseBeanSuccess(null, onIParserListener as BaseBean)}}/*** date 创建时间: 2023/7/23* auther gaoxiaoxiong* description 失败接口的调用**/override fun onRequestFail(throwable: Throwable?,status: String?,failMsg: String?,errorJsonString: String?,onIParserListener: OnIParserListener?) {if (throwable!null){val resPoneThrowable WanAndroidMAFRequest.mErrorHandlerFactory.netWorkException(throwable)//自定义解析错误处理这里是处理你跟服务器之间定义好的错误信息if (resPoneThrowable.code ExceptionHandle.ERROR.UNKNOWN.toString() throwable is AbsApiException){ WanAndroidMAFRequest.mErrorHandlerFactory.rollGateError(WanAndroidMAFRequest.mErrorHandlerFactory.getErrorHandlers().first(),throwable)}}onRequestDataFail(status?:, failMsg?:, onIParserListener as BaseBean?)onRequestBaseBeanFail(onIParserListener as BaseBean? )}/*** author gaoxiaoxiong* date 创建时间: 2023/8/6/006* description 请求失败**/open fun onRequestDataFail(code: String, msg: String, baseBean: BaseBean?null) {}/*** author gaoxiaoxiong* date 创建时间: 2023/8/6/006* description 请求失败**/open fun onRequestBaseBeanFail(baseBean: BaseBean?null) {}/*** author gaoxiaoxiong* date 创建时间: 2023/8/6/006* description 请求成功**/open fun onRequestDataSuccess(data: T?) {}/*** author gaoxiaoxiong* date 创建时间: 2023/8/6/006* description 请求成功* 返回含有 BaseBean 的**/open fun onRequestBaseBeanSuccess(data: T?, baseBean: BaseBean) {} }这里再定义错误收集处理方法比如我们登录错误了 /*** date 创建时间: 2023/7/24* auther gaoxiaoxiong* description 登陆错误异常**/ class LoginApiException(code: String, jsString: String, errorMessage: String ) :AbsApiException(code, jsString, errorMessage) { }既然错误了那么就的要有对应的Handler处理这个错误 /*** date 创建时间: 2023/7/24* auther gaoxiaoxiong* description 错误handler处理**/ class LoginErrorHandler(override var next: OnErrorHandler? null) : OnErrorHandler {private val TAG LoginErrorHandleroverride fun handleError(error: AbsApiException): Boolean {if (error is LoginApiException){if(BuildConfig.DEBUG){Log.d(TAG, ${LoginErrorHandler::class.simpleName}已处理异常);}return true}else{return false}} }//自定义错误factory的构建val mErrorHandlerFactory ErrorHandlerFactory().addErrorHandler(LoginErrorHandler()).init()提供的请求方法针对PHP不安规定返回错误的对象处理比如我要对象PHP给数组 /*** date 创建时间: 2023/7/22* auther gaoxiaoxiong* description get 请求**/suspend fun T getRequest(funName: String,urlMap: MapString, Any mutableMapOf(),dataParseSuFaCall: DataParseSuFaCallT) {mMobileRequest.get(RqParamModel(baseUrl REQUEST_URL_FIRST,funName funName,null,urlMap urlMap,emResultType EmResultType.REQUEST_RESULT_OBJECT //这里是定义你想要的类型的默认是obj), dataParseSuFaCall, dataParseSuFaCall)}flow方式的拿到结果 flow方式其实原理也是通过接口方式拿到结果然后通过callbackFlow拿到数据 /*** author gaoxiaoxiong* date 创建时间: 2023/8/6/006* description flow方式的调用**/suspend inline fun reified T createRequestFlow(funName: String) callbackFlowT {val dataParseSuFaCall object : DataParseSuFaCallT() {override fun onRequestDataSuccess(data: T?) {super.onRequestDataSuccess(data)trySend(data!!)}}mMobileRequest.get(RqParamModel(baseUrl REQUEST_URL_FIRST,funName funName,null,urlMap mutableMapOf()), dataParseSuFaCall, dataParseSuFaCall)awaitClose { }}/*** date 创建时间: 2023/7/25* auther gxx* description 发起网络请求**/fun readBanner(){viewModelScope.launch{WanAndroidMAFRequest.createRequestFlowMutableListBanner(banner/json).collect{//flow方式mBannerFlow.emit(Gson().toJson(it))}}}自定义Api interface CustomApiService {//自定义接口名称JvmSuppressWildcardsGETsuspend fun readBook(Url url: String,QueryMap urlMap: MapString, Any): ResponseBody}private val mJsonParseResult JsonParseResult()//自定义api请求的Demosuspend fun T readBannerJson(dataParseSuFaCall: DataParseSuFaCallT) {val api mOkHttpManager.getApi(REQUEST_URL_FIRST, CustomApiService::class.java)val url ${REQUEST_URL_FIRST}banner/jsonval responseBody api?.readBook(url, mutableMapOf())mMobileRequest.responseBodyTransformJson(REQUEST_URL_FIRST,banner/json,responseBody,dataParseSuFaCall).collect{if (it null) {returncollect}mJsonParseResult.doIParseResult(${REQUEST_URL_FIRST}banner/json,EmResultType.REQUEST_RESULT_OWN,listener it,dataParseSuFaCall,dataParseSuFaCall)}} 站在巨人的肩膀上 开发搭建网络请求框架 3这里借用了他的链式处理的思想点赞点赞
http://www.zqtcl.cn/news/873832/

相关文章:

  • 环球资源网站网址微信管理中心
  • 青岛seo建站企业网址下载
  • 开发网站多少钱一个月做网站宽度
  • wordpress企业站主题哪个好做床上用品网站
  • 宜兴市做网站网站建设简讯
  • 点的排版设计网站音乐网站网页设计
  • 牛商网做网站的思路建设网站的机构
  • flash网站制作实例自适应网站做百度推广
  • 深圳建立网站电影里的做视频在线观看网站
  • 国家建设标准发布网站在哪里在线教育网站怎样建设
  • 徐州 商城网站设计winserver wordpress
  • 做网络课程的网站一般网站的架构
  • 网站建设包含哪些内容句容住房和城乡建设局网站
  • 做网站是做完给钱还是新房装修图片
  • 阿里云建站视频wordpress显示摘要插件
  • 济宁网站建设 企业谷网站开发有什么用
  • 网站建设一般多少钱官网代做网站公司哪家好
  • 页面简洁的网站深圳广告宣传片拍摄
  • 做外卖网站青岛助创网络科技有限公司
  • 怎么选择优秀的网站建设公司建设银行宁波分行 招聘网站
  • 工艺品网站模板下载-古色古香建站软件排名
  • 微视频网站源码网站建设目标个人博客dw
  • 山西省建设厅入晋备案网站洛阳网站在哪备案
  • 可以做物理试验的网站有哪些仿微博网站模板
  • 网站横幅怎做网站到期不想续费
  • 黑龙江网站备案管理局济南网站建设策划
  • 网站怎么静态化网页设计与制作图片显示不出来
  • 市场营销推广策划方案网站如何做标题优化
  • 怎么让客户做网站手机网站如何优化
  • 柳州市住房和城乡建设局网站首页赣州章贡区人口