Ver código fonte

为Request添加tags/headers函数返回全部标签/请求头

drake 4 anos atrás
pai
commit
435f395008

+ 1 - 6
net/src/main/java/com/drake/net/interceptor/NetOkHttpInterceptor.kt

@@ -9,9 +9,7 @@ import com.drake.net.exception.NetUnknownHostException
 import com.drake.net.okhttp.attachToNet
 import com.drake.net.okhttp.detachFromNet
 import com.drake.net.request.downloadListeners
-import com.drake.net.request.setLabel
 import com.drake.net.request.uploadListeners
-import com.drake.net.tag.NetLabel
 import okhttp3.Interceptor
 import okhttp3.Response
 import java.net.ConnectException
@@ -26,10 +24,7 @@ object NetOkHttpInterceptor : Interceptor {
     override fun intercept(chain: Interceptor.Chain): Response {
         var request = chain.request()
         val netRequestBody = request.body?.toNetRequestBody(request.uploadListeners())
-        request = request.newBuilder().method(request.method, netRequestBody).apply {
-            if (request.uploadListeners() == null) setLabel(NetLabel.UploadListeners())
-            if (request.downloadListeners() == null) setLabel(NetLabel.DownloadListeners())
-        }.build()
+        request = request.newBuilder().method(request.method, netRequestBody).build()
         val response = try {
             chain.call().attachToNet()
             chain.proceed(request)

+ 71 - 3
net/src/main/java/com/drake/net/request/BaseRequest.kt

@@ -37,12 +37,21 @@ import kotlin.reflect.typeOf
 
 abstract class BaseRequest {
 
+    /** 请求的Url构造器 */
     open var httpUrl: HttpUrl.Builder = HttpUrl.Builder()
+
+    /** 当前请求的数据转换器 */
     open var converter: NetConverter = NetConfig.converter
+
+    /** 请求的方法 */
     open var method = Method.GET
 
     //<editor-fold desc="OkHttpClient" >
+
+    /** 请求对象构造器 */
     open var okHttpRequest: Request.Builder = Request.Builder()
+
+    /** 请求客户端 */
     open var okHttpClient = NetConfig.okHttpClient
         set(value) {
             field = value.toNetOkhttp()
@@ -70,10 +79,16 @@ abstract class BaseRequest {
         }
     }
 
+    /**
+     * 设置Url
+     */
     open fun setUrl(url: HttpUrl) {
         httpUrl = url.newBuilder()
     }
 
+    /**
+     * 设置Url
+     */
     open fun setUrl(url: URL) {
         setUrl(url.toString())
     }
@@ -95,6 +110,9 @@ abstract class BaseRequest {
         }
     }
 
+    /**
+     * 设置Url上的Query参数
+     */
     fun setQuery(name: String, value: String?, encoded: Boolean = false) {
         if (encoded) {
             httpUrl.setEncodedQueryParameter(name, value)
@@ -105,12 +123,42 @@ abstract class BaseRequest {
 
     //<editor-fold desc="Param">
 
+    /**
+     * 基础类型表单参数
+     *
+     * 如果当前请求为Url请求则为Query参数
+     * 如果当前请求为表单请求则为表单参数
+     * 如果当前为Multipart包含流/文件的请求则为multipart参数
+     */
     abstract fun param(name: String, value: String?)
 
+    /**
+     * 基础类型表单参数
+     *
+     * 如果当前请求为Url请求则为Query参数
+     * 如果当前请求为表单请求则为表单参数
+     * 如果当前为Multipart包含流/文件的请求则为multipart参数
+     *
+     * @param encoded 对应OkHttp参数函数中的encoded表示当前字段参数已经编码过. 不会再被自动编码
+     */
     abstract fun param(name: String, value: String?, encoded: Boolean)
 
+    /**
+     * 基础类型表单参数
+     *
+     * 如果当前请求为Url请求则为Query参数
+     * 如果当前请求为表单请求则为表单参数
+     * 如果当前为Multipart包含流/文件的请求则为multipart参数
+     */
     abstract fun param(name: String, value: Number?)
 
+    /**
+     * 基础类型表单参数
+     *
+     * 如果当前请求为Url请求则为Query参数
+     * 如果当前请求为表单请求则为表单参数
+     * 如果当前为Multipart包含流/文件的请求则为multipart参数
+     */
     abstract fun param(name: String, value: Boolean?)
 
     //</editor-fold>
@@ -132,13 +180,29 @@ abstract class BaseRequest {
     }
 
     /**
-     * 将一个任意对象添加到Request对象中, 一般用于在拦截器或者转换器中被获取到标签, 针对某个请求的特殊业务逻辑
-     * 使用`Request.tag()`获取标签
+     * 使用Any::class作为键名添加标签
+     * 使用Request.tag()返回标签
      */
     fun setTag(tag: Any?) {
         okHttpRequest.tag(tag)
     }
 
+    /**
+     * 使用[type]作为键名添加标签
+     * 使用Request.label<T>()或者Request.tag(type)返回标签
+     */
+    fun <T> setTag(type: Class<in T>, tag: T?) {
+        okHttpRequest.tag(type, tag)
+    }
+
+    /**
+     * 使用[T]作为键名添加标签
+     * 使用Request.label<T>()或者Request.tag(type)返回标签
+     */
+    inline fun <reified T> setLabel(tag: T?) {
+        okHttpRequest.setLabel(tag)
+    }
+
     /**
      * 添加标签
      * 使用`Request.tag(name)`得到指定标签
@@ -153,8 +217,9 @@ abstract class BaseRequest {
     /**
      * 为请求附着针对Kotlin的Type信息
      */
+    @OptIn(ExperimentalStdlibApi::class)
     inline fun <reified T> setKType() {
-        okHttpRequest.setKType<T>()
+        okHttpRequest.setKType(typeOf<T>())
     }
 
     //</editor-fold>
@@ -270,6 +335,9 @@ abstract class BaseRequest {
         okHttpRequest.setLogRecord(enabled)
     }
 
+    /**
+     * 构建请求对象Request
+     */
     open fun buildRequest(): Request {
         return okHttpRequest.method(method.name, null)
             .url(httpUrl.build())

+ 38 - 1
net/src/main/java/com/drake/net/request/BodyRequest.kt

@@ -30,10 +30,31 @@ import java.io.File
 
 open class BodyRequest : BaseRequest() {
 
+    /**
+     * 请求体
+     */
     open var body: RequestBody? = null
+
+    /**
+     * multipart请求体
+     * 主要存放文件/IO流
+     */
     open var partBody: MultipartBody.Builder by lazyField { MultipartBody.Builder() }
+
+    /**
+     * 表单请求体
+     * 当你设置`partBody`后当前表单请求体中的所有参数都会被存放到partBody中
+     */
     open var formBody: FormBody.Builder by lazyField { FormBody.Builder() }
+
+    /**
+     * multipart请求体的媒体类型
+     */
     open var mediaType: MediaType = MediaConst.FORM
+
+    /**
+     * 请求方法
+     */
     override var method = Method.POST
 
     //<editor-fold desc="Param">
@@ -90,29 +111,45 @@ open class BodyRequest : BaseRequest() {
     //</editor-fold>
 
     //<editor-fold desc="JSON">
+
+    /**
+     * 添加Json为请求体
+     */
     fun json(body: JSONObject?) {
         this.body = body?.toString()?.toRequestBody(MediaConst.JSON)
     }
 
+    /**
+     * 添加Json为请求体
+     */
     fun json(body: JSONArray?) {
         this.body = body?.toString()?.toRequestBody(MediaConst.JSON)
     }
 
+    /**
+     * 添加Json为请求体
+     */
     fun json(body: String?) {
         this.body = body?.toRequestBody(MediaConst.JSON)
     }
 
+    /**
+     * 添加Json为请求体
+     */
     fun json(body: Map<String, Any?>?) {
         this.body = JSONObject(body ?: return).toString().toRequestBody(MediaConst.JSON)
     }
 
+    /**
+     * 添加Json对象为请求体
+     */
     fun json(vararg body: Pair<String, Any?>) {
         this.body = JSONObject(body.toMap()).toString().toRequestBody(MediaConst.JSON)
     }
     //</editor-fold>
 
     /**
-     * 上传进度监听器
+     * 添加上传进度监听器
      */
     fun addUploadListener(progressListener: ProgressListener) {
         okHttpRequest.uploadListeners().add(progressListener)

+ 64 - 16
net/src/main/java/com/drake/net/request/RequestExtension.kt

@@ -23,11 +23,10 @@ import com.drake.net.interfaces.ProgressListener
 import com.drake.net.tag.NetLabel
 import okhttp.OkHttpUtils
 import okhttp3.FormBody
+import okhttp3.Headers
 import okhttp3.Request
 import java.util.concurrent.ConcurrentLinkedQueue
-import kotlin.jvm.Throws
 import kotlin.reflect.KType
-import kotlin.reflect.typeOf
 
 //<editor-fold desc="请求属性">
 
@@ -123,40 +122,70 @@ fun Request.Builder.setKType(type: KType) = apply {
     setLabel(NetLabel.RequestKType(type))
 }
 
-@OptIn(ExperimentalStdlibApi::class)
-inline fun <reified T> Request.Builder.setKType() = apply {
-    setLabel(NetLabel.RequestKType(typeOf<T>()))
+/**
+ * 全部的请求头
+ */
+fun Request.Builder.headers(): Headers.Builder {
+    return OkHttpUtils.headers(this)
 }
 //</editor-fold>
 
 //<editor-fold desc="标签">
 
 /**
- * 返回键值对的tag
+ * 返回键值对的标签
+ * 键值对标签即OkHttp中的实际tag(在Net中叫label)中的一个Map集合
  */
 fun Request.tag(name: String): Any? {
     return label<NetLabel.Tags>()?.get(name)
 }
 
 /**
- * 设置键值对的tag
+ * 设置键值对的标签
  */
 fun Request.setTag(name: String, value: Any?) {
+    val tags = tags()
+    if (value == null) {
+        tags.remove(name)
+    } else {
+        tags[name] = value
+    }
+}
+
+/**
+ * 设置键值对的tag
+ */
+fun Request.Builder.setTag(name: String, value: Any?) = apply {
+    val tags = tags()
+    if (value == null) {
+        tags.remove(name)
+    } else {
+        tags[name] = value
+    }
+}
+
+/**
+ * 全部键值对标签
+ */
+fun Request.tags(): HashMap<String, Any?> {
     var tags = label<NetLabel.Tags>()
     if (tags == null) {
         tags = NetLabel.Tags()
         setLabel(tags)
     }
-    tags[name] = value
+    return tags
 }
 
-fun Request.Builder.setTag(name: String, value: Any?) = apply {
+/**
+ * 全部键值对标签
+ */
+fun Request.Builder.tags(): HashMap<String, Any?> {
     var tags = label<NetLabel.Tags>()
     if (tags == null) {
         tags = NetLabel.Tags()
         setLabel(tags)
     }
-    tags[name] = value
+    return tags
 }
 
 /**
@@ -170,21 +199,40 @@ inline fun <reified T> Request.label(): T? {
  * 返回OkHttp的tag(通过Class区分的tag)
  */
 inline fun <reified T> Request.Builder.label(): T? {
-    return OkHttpUtils.tags(this)[T::class.java] as? T
+    return labels()[T::class.java] as? T
 }
 
 /**
  * 设置OkHttp的tag(通过Class区分的tag)
  */
-inline fun <reified T> Request.setLabel(any: T) = apply {
-    OkHttpUtils.tags(this)[T::class.java] = any
+inline fun <reified T> Request.setLabel(value: T) = apply {
+    val labels = labels()
+    if (value == null) {
+        labels.remove(T::class.java)
+    } else {
+        labels[T::class.java] = value
+    }
 }
 
 /**
  * 设置OkHttp的tag(通过Class区分的tag)
  */
-inline fun <reified T> Request.Builder.setLabel(any: T) = apply {
-    tag(T::class.java, any)
+inline fun <reified T> Request.Builder.setLabel(value: T) = apply {
+    tag(T::class.java, value)
+}
+
+/**
+ * 标签集合
+ */
+fun Request.labels(): MutableMap<Class<*>, Any?> {
+    return OkHttpUtils.tags(this)
+}
+
+/**
+ * 标签集合
+ */
+fun Request.Builder.labels(): MutableMap<Class<*>, Any?> {
+    return OkHttpUtils.tags(this)
 }
 
 //</editor-fold>
@@ -302,7 +350,7 @@ fun Request.addDownloadListener(progressListener: ProgressListener) {
 //</editor-fold>
 
 /**
- * 转换器
+ * 返回请求包含的转换器
  */
 fun Request.converter(): NetConverter {
     return label<NetConverter>() ?: NetConfig.converter

+ 0 - 0
net/src/main/java/com/drake/net/response/ResponseExtention.kt → net/src/main/java/com/drake/net/response/ResponseExtension.kt


+ 18 - 0
net/src/main/java/okhttp/OkHttpUtils.java

@@ -3,19 +3,37 @@ package okhttp;
 import java.lang.reflect.Field;
 import java.util.Map;
 
+import kotlin.jvm.JvmStatic;
+import okhttp3.Headers;
 import okhttp3.Request;
 
 @SuppressWarnings("KotlinInternalInJava")
 public class OkHttpUtils {
 
+    /**
+     * 标签集合
+     */
+    @JvmStatic
     public static Map<Class<?>, Object> tags(Request.Builder builder) {
         return builder.getTags$okhttp();
     }
 
+    /**
+     * 通过反射返回Request的标签可变集合
+     */
+    @JvmStatic
     public static Map<Class<?>, Object> tags(Request request) throws NoSuchFieldException, IllegalAccessException {
         Field field = request.getTags$okhttp().getClass().getDeclaredField("m");
         field.setAccessible(true);
         Object tags = field.get(request.getTags$okhttp());
         return (Map<Class<?>, Object>) tags;
     }
+
+    /**
+     * 全部的请求头
+     */
+    @JvmStatic
+    public static Headers.Builder headers(Request.Builder builder) {
+        return builder.getHeaders$okhttp();
+    }
 }