下面给出 **Fuel 2.x** 的 **“开箱即用”** 封装类,**同时支持**:

下面给出 Fuel 2.x"开箱即用" 封装类,同时支持

  • POST JSONapplication/json
  • POST 表单application/x-www-form-urlencoded
  • 文件上传multipart/form-data

复制即用零配置自动切回主线程回调


✅ 1. 添加依赖(build.gradle)

kotlin 复制代码
implementation 'com.github.kittinunf.fuel:fuel:2.3.1'
implementation 'com.github.kittinunf.fuel:fuel-android:2.3.1'   // 自动切主线程
implementation 'com.github.kittinunf.fuel:fuel-gson:2.3.1'      // JSON 自动序列化

✅ 2. 封装类(copy 即用)

kotlin 复制代码
object HttpFuel {

    /* ① POST JSON ---------------------------------------------------------- */
    fun postJson(
        url: String,
        body: Any,                      // 任意对象 / Map / String
        onSuccess: (String) -> Unit,
        onError: (String) -> Unit
    ) {
        Fuel.post(url)
            .jsonBody(Gson().toJson(body))        // 自动转 JSON
            .responseString { _, _, result ->
                val (data, error) = result
                if (error == null) onSuccess(data!!)
                else onError(error.message)
            }
    }

    /* ② POST 表单 ---------------------------------------------------------- */
    fun postForm(
        url: String,
        params: List<Pair<String, Any?>>,
        onSuccess: (String) -> Unit,
        onError: (String) -> Unit
    ) {
        Fuel.post(url, params.filterNotNull())
            .responseString { _, _, result ->
                val (data, error) = result
                if (error == null) onSuccess(data!!)
                else onError(error.message)
            }
    }

    /* ③ 上传文件(可带表单字段) ------------------------------------------- */
    fun upload(
        url: String,
        params: List<Pair<String, Any?>> = emptyList(),
        file: File,
        fileKey: String = "file",
        onProgress: (Long, Long) -> Unit = { _, _ -> },
        onSuccess: (String) -> Unit,
        onError: (String) -> Unit
    ) {
        Fuel.upload(url, Method.POST, params)
            .source { _, _ -> file }
            .name { fileKey }
            .progress { read, total -> onProgress(read, total) }
            .responseString { _, _, result ->
                val (data, error) = result
                if (error == null) onSuccess(data!!)
                else onError(error.message)
            }
    }
}

✅ 3. 使用示例(Activity / ViewModel)

kotlin 复制代码
/* 3.1 发 JSON */
HttpFuel.postJson(
    url = "http://192.168.1.100:8809/sync/one688",
    body = mapOf("ben" to ben)        // 任意对象/Map
) { resp -> Log.d("JSON", resp) }

/* 3.2 发表单 */
HttpFuel.postForm(
    url = "http://192.168.1.100:8809/sync/one688",
    params = listOf("id" to 0, "tlite" to "text")
) { resp -> Log.d("FORM", resp) }

/* 3.3 上传文件 + 进度 */
val file = File(cacheDir, "a.jpg")
HttpFuel.upload(
    url = "http://192.168.1.100:8809/upload",
    params = listOf("user" to "tom"),
    file = file,
    onProgress = { read, total ->
        val pct = (read * 100 / total).toInt()
        Log.d("UP", "$pct%")
    }
) { resp -> Log.d("UP", "完成:$resp") }

✅ 4. 自动切回主线程

fuel-android 模块已保证 回调在主线程可直接更新 UI


✅ 5. 自定义全局配置(可选)

kotlin 复制代码
FuelManager.instance.basePath = "http://192.168.1.100:8809/"
FuelManager.instance.baseHeaders = mapOf("token" to "abc123")

🔚 一句话总结

引入 fuel + fuel-android + fuel-gson复制 HttpFuel 单例
postJson / postForm / upload 三种调用 开箱即用主线程回调零配置发请求

相关推荐
佛系打工仔2 小时前
绘制K线第二章:背景网格绘制
android·前端·架构
my_power5205 小时前
车载安卓面试题汇总
android
csj505 小时前
安卓基础之《(15)—内容提供者(1)在应用之间共享数据》
android
yeziyfx6 小时前
kotlin中 ?:的用法
android·开发语言·kotlin
2501_915918417 小时前
只有 Flutter IPA 文件,通过多工具组合完成有效混淆与保护
android·flutter·ios·小程序·uni-app·iphone·webview
robotx7 小时前
AOSP 设置-提示音和振动 添加一个带有开关(Switch)的设置项
android
青莲8437 小时前
RecyclerView 完全指南
android·前端·面试
青莲8437 小时前
Android WebView 混合开发完整指南
android·前端·面试
龙之叶7 小时前
【Android Monkey源码解析三】- 运行解析
android
KevinWang_9 小时前
Android 的 assets 资源和 raw 资源有什么区别?
android