修改请求体表单格式为Json格式

303 阅读1分钟

老项目里面使用的是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")
}