|
|
@@ -0,0 +1,86 @@
|
|
|
+package com.adealink.weparty.webview.jsnativemethod
|
|
|
+
|
|
|
+import com.adealink.frame.base.Callback
|
|
|
+import com.adealink.frame.log.Log
|
|
|
+import com.adealink.weparty.App
|
|
|
+import com.adealink.weparty.webview.jsbridge.callback.JSBridgeCallback
|
|
|
+import com.adealink.weparty.webview.jsbridge.data.JSResponse
|
|
|
+import com.adealink.weparty.webview.jsbridge.method.JSNativeMethod
|
|
|
+import com.google.gson.annotations.SerializedName
|
|
|
+import retrofit2.Constants
|
|
|
+
|
|
|
+data class NetworkRequestReq(
|
|
|
+ @SerializedName("method") val method: String?,
|
|
|
+ @SerializedName("path") val path: String?,
|
|
|
+ @SerializedName("data") val data: String?,
|
|
|
+ @SerializedName("headers") val headers: Map<String, String>?,
|
|
|
+ @SerializedName("config") val config: RequestConfig? // 请求配置
|
|
|
+)
|
|
|
+
|
|
|
+data class RequestConfig(
|
|
|
+ @SerializedName("isCore") val isCore : Boolean = false, // 是否核心请求,核心请求会上报流量、请求时间相关信息
|
|
|
+ @SerializedName("timeout") val timeout : Long? = null
|
|
|
+)
|
|
|
+
|
|
|
+enum class NetworkRequestMethod(val method: String) {
|
|
|
+ GET("GET"),
|
|
|
+ POST("POST"),
|
|
|
+ PUT("PUT"),
|
|
|
+ DELETE("DELETE");
|
|
|
+
|
|
|
+ companion object {
|
|
|
+ fun map(method: String?): NetworkRequestMethod {
|
|
|
+ return entries.firstOrNull { it.method == method } ?: POST
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class NetworkRequestSNativeMethod: JSNativeMethod<NetworkRequestReq, String> {
|
|
|
+
|
|
|
+ companion object {
|
|
|
+ const val TAG = "tag_h5_network"
|
|
|
+ }
|
|
|
+
|
|
|
+ override val methodName: String = "onNetworkRequest"
|
|
|
+
|
|
|
+ override fun handleMethodCall(data: NetworkRequestReq, callback: JSBridgeCallback<String>?) {
|
|
|
+ Log.d(TAG, "request, data:${data}")
|
|
|
+
|
|
|
+ if (data.path.isNullOrEmpty()) {
|
|
|
+ callback?.reject(JSResponse.JSError.CLIENT_HANDLE_REQUEST_DATA_TYPE_ERROR)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ val url = buildUrl(App.instance.networkService.baseUrl, data.path)
|
|
|
+ val headers = (data.headers?: hashMapOf()).toMutableMap()
|
|
|
+
|
|
|
+ // 核心请求
|
|
|
+ if(data.config?.isCore == true) {
|
|
|
+ headers[Constants.KEY_CORE_REQ] = Constants.CORE_REQ_VALUE
|
|
|
+ }
|
|
|
+
|
|
|
+ App.instance.networkService.http(
|
|
|
+ NetworkRequestMethod.map(data.method?.uppercase()).method,
|
|
|
+ url,
|
|
|
+ headers,
|
|
|
+ data.data?: "",
|
|
|
+ data.config?.timeout,
|
|
|
+ object : Callback<String> {
|
|
|
+
|
|
|
+ override fun onCall(t: String?) {
|
|
|
+ if (t.isNullOrEmpty()) {
|
|
|
+ Log.i(TAG, "response, url: ${url}, data is null")
|
|
|
+ callback?.reject(JSResponse.JSError.CLIENT_ERROR)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ Log.i(TAG, "response, url: ${url}, SUCCESS")
|
|
|
+ callback?.resolve(t)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun buildUrl(baseUrl: String, path: String, removePrefix: String = "api/"): String {
|
|
|
+ return baseUrl.trimEnd('/') + "/" + path.removePrefix(removePrefix).trimStart('/')
|
|
|
+ }
|
|
|
+
|
|
|
+}
|