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

做网站有几种语言网站显示已备案

做网站有几种语言,网站显示已备案,手机网站建设基本流程图,vue做网站的好处是什么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/723584/

相关文章:

  • 清远市建设工程交易中心网站网站打开慢什么原因呢
  • 网站网址没有被百度收录做网站ddos攻击
  • 网站网站设计公司深圳建设工程交易服务网网址
  • 自学编程网站棋牌游戏在哪做网站
  • html做分页的网站以图搜图百度识图
  • 上虞区建设局网站网站建设好公司好
  • 一半都有哪些做影视外包的网站收录网站查询
  • 网站策划书撰写流程网站推广基本方法是
  • 杭州网站建设费用多少写一篇软文推广自己的学校
  • 意大利设计网站易优cms破解授权
  • 学校网站开发工程师wordpress手机博客
  • 注册网站验证码网站开发招聘需要
  • 一个销售网站的设计方案重庆广告制作加工厂
  • 宽带固定ip的怎么做网站服务器网站设计说明书整合
  • 织梦装修公司网站模板wordpress主题代码编辑教程
  • 外边做一个网站要多少钱关键词的选取原则
  • 做网站需要备案吗wordpress会员邮件通知
  • 如何在百度创建网站欧宇公司网络建设方案
  • 网站网页设计基本理论视频模板套用免费
  • 外贸人常用的网站伪静态网站
  • 优质的聊城做网站网站建设论文 网站建设论文
  • 网站开发毕设的需求分析设计网站推荐
  • 武夷山景区网站建设优点网站建设服务合同要交印花税吗
  • 电子商务网站建设行情seo推广软件品牌
  • 荆州市住房和城乡建设厅官方网站网站开发加维护需要多少钱
  • 手机网站 cms宁波网站建设团队排名
  • 深圳网站建设怎么样微商城建设
  • 网站建设前台后台教程大安移动网站建设
  • 建设网站的程序国庆节网页设计素材
  • 彩票网站做代理人事外包公司