18034727885
2026-08-19 1da9dab82c7014b8b535197bdfbdac862cc36e1a
app/src/main/java/com/igo/user/network/RRetrofit.kt
@@ -1,34 +1,79 @@
package com.igo.user.network
import android.util.Log
import cn.sinata.xldutils.utils.LanguageUtil
import cn.sinata.xldutils.utils.SPUtils
import com.igo.user.BuildConfig
import com.igo.user.IGoApplication
import com.igo.user.R
import com.igo.user.utils.Const
import okhttp3.FormBody
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import java.security.KeyStore
import java.security.cert.CertificateFactory
import java.security.cert.X509Certificate
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.TrustManagerFactory
import javax.net.ssl.X509TrustManager
/**
 * 网络请求retrofit初始化。
 */
class RRetrofit private constructor() {
class RRetrofit(val isUseCert: Boolean = false) {
    private val loggingInterceptor by lazy {
        LoggingInterceptor()
    }
    /**
     * 创建只信任指定证书文件的TrustManager
     * @param certificateResId 证书资源ID (放在 res/raw/ 目录下)
     */
    fun createTrustManager(certificateResId: Int): X509TrustManager? {
        val certificateFactory = CertificateFactory.getInstance("X.509")
        // 读取证书文件
        IGoApplication.appContext?.resources?.openRawResource(certificateResId)?.use {
            val certificate = certificateFactory.generateCertificate(it) as X509Certificate
            // 创建包含该证书的KeyStore
            val keyStore = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
                load(null, null)
                setCertificateEntry("server", certificate)
            }
            // 创建TrustManager
            val trustManagerFactory = TrustManagerFactory.getInstance(
                TrustManagerFactory.getDefaultAlgorithm()
            ).apply {
                init(keyStore)
            }
            return trustManagerFactory.trustManagers.first() as X509TrustManager
        }
        return null
    }
    private fun getSSLSocketFactory(trustManager: X509TrustManager): SSLSocketFactory {
        return SSLContext.getInstance("TLS").apply {
            init(null, arrayOf(trustManager), null)
        }.socketFactory
    }
    private val retrofit: Retrofit = Retrofit.Builder()
            .baseUrl(Apis.BASE_URL)
            .addConverterFactory(JsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(OkHttpClient.Builder()
                    .addInterceptor(HttpLoggingInterceptor().apply {
                        level = HttpLoggingInterceptor.Level.BODY
                    })
        .baseUrl(Apis.BASE_URL)
        .addConverterFactory(JsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .client(
            OkHttpClient.Builder()
                .addInterceptor { chain ->
                    //1=简体中文,2=英语,3=印尼语
                    val language = SPUtils.instance().getString("language", "en")
                    var request = chain.request()
                    if (request.method() == "POST"&&!request.url().toString().contains("base/user/image")) {
                    if (request.method() == "POST" && !request.url().toString()
                            .contains("base/user/image")
                    ) {
                        val bodyBuilder = FormBody.Builder()
                        var formBody:FormBody
                        var formBody: FormBody
                        if (request.body() is FormBody) {
                            formBody = request.body() as FormBody
                            (0 until formBody.size()).forEach {
@@ -39,13 +84,14 @@
                                )
                            }
                        }
                        formBody = bodyBuilder.addEncoded(
                            "language", when (language) {
                                "ch" -> "1"
                                "fr" -> "3"
                                else -> "2"
                            }
                        ).build()
                        var language = request.header("language")
                        language = if (language.isNullOrEmpty()) {
                            LanguageUtil.getLanguage()!!
                        } else {
                            language
                        }
                        //1=简体中文,2=英语,3=法语
                        formBody = bodyBuilder.addEncoded("language", getLanguageType(language)).build()
                        request = request.newBuilder().post(formBody).build()
                    }
                    chain.proceed(request)
@@ -54,15 +100,33 @@
                    val token = SPUtils.instance().getString(Const.User.TOKEN)
                    val request =
                        if (token.isEmpty()) chain.request() else
                            chain.request().newBuilder().addHeader("Authorization", "Bearer $token").build()
                    Log.e(Const.Tag,request.headers().toString())
                            chain.request().newBuilder().addHeader("Authorization", "Bearer $token")
                                .build()
                    Log.e(Const.Tag, request.headers().toString())
                    chain.proceed(request)
                }
                .apply {
                    if (isUseCert) {
                        createTrustManager(R.raw.star_gopost_ci)?.also {
                            sslSocketFactory(getSSLSocketFactory(it), it)
                        }
                    }
                    if (BuildConfig.DEBUG) {
                        addInterceptor(loggingInterceptor)
                    }
                }
                .build())
            .build()
        .build()
    companion object {
        fun instance() = RRetrofit()
        fun instance(isUseCert: Boolean = true) = RRetrofit(isUseCert)
        fun getLanguageType(language: String): String {
            return when (language) {
                Const.Language.CHINESE -> "1"
                Const.Language.FRENCH -> "3"
                else -> "2"
            }
        }
    }
    fun <T> create(clazz: Class<T>): T = retrofit.create(clazz)