老项目里面使用的是EasyHttp这个网络框架,个人还是觉得以前的网络框架好用,一个是封装好的OkHttpClient,还有一个是Retrofit这个框架。
现在使用https做请求,传参也由原来的表单变成了json格式,需要在传参那里对原来的表单格式进行转换成json格式。
先说下EsayHttp这个如何做到的吧,这个框架已经封装的很完善了,只需要在初始化EasyConfig的时候传入的RequestServer()这个类里面设置一下就可以了,具体实现如下:
private fun initEasyHttp(application: KudoudApplication) {
//读取证书文件
val certificate = resources.openRawResource(R.raw.ssl1)
//用EasyHttp自带的SSL工具类生成SSL配置
val sslConfig = HttpSslFactory.generateSslConfig(certificate)
// 网络请求框架初始化
val okHttpClient = OkHttpClient.Builder()
.sslSocketFactory(sslConfig.sslSocketFactory, sslConfig.trustManager)
.addNetworkInterceptor(StethoInterceptor())
.build()
EasyConfig.with(okHttpClient)
// 设置服务器配置(必须设置)
.setServer(RequestServer())
// 设置请求处理策略(必须设置)
.setHandler(RequestHandler(application))
// 设置请求重试次数
.setRetryCount(1)
.setInterceptor(object : IRequestInterceptor {
override fun interceptArguments(
httpRequest: HttpRequest<*>,
params: HttpParams,
headers: HttpHeaders
) {
// 添加全局请求头
val token: String = SPUtil.getString(application, "token").toString()
val appLanguage = MultiLanguages.getAppLanguage().language
if (appLanguage == Locale.CHINA.language) {
headers.put("Language", "chinese")
} else {
headers.put("Language", "en")
}
headers.put("Authorization", "Bearer $token")
headers.put("timestamp", System.currentTimeMillis().toString())
}
})
.into()
}
public class RequestServer implements IRequestServer {
@Override
public String getHost() {
return "https://jbh.aishenlan.com/api/app";
}
//设置传参格式为JSON
@NonNull
@Override
public BodyType getBodyType() {
return BodyType.JSON;
}
}
然后是之前经常使用的OkHttpUtils封装的这个OkHttpClient做请求的类,这个和Retrofit修改策略类似。
修改前:
//post builder 参数
FormBody.Builder builder = new FormBody.Builder();
if (params != null && params.size() > 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
Log.i("zyh test", "post: params key = " + entry.getKey() + " params value = " + entry.getValue());
builder.add(entry.getKey(), entry.getValue());
}
}
Request request;
//发起request
if (context == null) {
request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
} else {
request = new Request.Builder()
.url(url)
.post(builder.build())
.tag(context)
.build();
}
修改后:
RequestBody formBody = FormBody.create(JSON, new JSONObject(params).toString());
// RequestBody requestBody = RequestBody.create(JSON, jsonObject.toString());
Request request;
//发起request
if (context == null) {
request = new Request.Builder()
.url(url)
.post(formBody)
.build();
} else {
request = new Request.Builder()
.url(url)
.post(formBody)
.tag(context)
.build();
}
而Retrofit先要修改Service类中Api注解,直接传入RequestBody
修改前:
@FormUrlEncoded
@POST("api/carbon/login")
suspend fun login(@Field("userID") userName: String
,@Field("password") userPassword: String):WanResponse<LoginInfo>
修改后:
@POST("user/login")
suspend fun login(@Body body: RequestBody):
WanResponse<LoginInfo>
然后在获取到传参的HashMap之后同样的使用RequestBody将传参转换为JSON格式即可
GlobalScope.launch {
val params = HashMap<String, String>()
params[Constant.PARAM_EMAIL] = "2287066987@qq.com"
params[Constant.PARAM_PASSWORD] = "wfz520"
val requestBody: RequestBody = RequestBody.create(
JSON,
JSONObject(params as Map<*, *>?).toString()
)
val retrofit = BaseRetrofitClient()
val result = retrofit.getService(KudoudService::class.java,KudoudService.BASE_URL).login(requestBody)
Logger.d("luxiang result = $result")
}