Commit cfab77e2 by 徐健

Merge remote-tracking branch 'origin/dev' into feature/test_home_pager

# Conflicts:
#	config.gradle
parents 1717b7cf b1b6a6a5
...@@ -13,7 +13,6 @@ import android.util.Log ...@@ -13,7 +13,6 @@ import android.util.Log
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.tbruyelle.rxpermissions2.RxPermissions import com.tbruyelle.rxpermissions2.RxPermissions
import com.umeng.analytics.MobclickAgent import com.umeng.analytics.MobclickAgent
import com.umeng.commonsdk.framework.UMModuleRegister.getAppContext
import com.ydl.audioim.YDLavManager import com.ydl.audioim.YDLavManager
import com.ydl.component.music.MusicPlayActivity import com.ydl.component.music.MusicPlayActivity
import com.ydl.component.mvp.DemoContract import com.ydl.component.mvp.DemoContract
...@@ -137,7 +136,7 @@ class MainActivity : BaseLceActivity<DemoContract.View, DemoContract.Presenter>( ...@@ -137,7 +136,7 @@ class MainActivity : BaseLceActivity<DemoContract.View, DemoContract.Presenter>(
override fun reLoadData() { override fun reLoadData() {
mPresenter?.loadUsers() mPresenter.loadHome()
} }
......
...@@ -43,14 +43,14 @@ ext { ...@@ -43,14 +43,14 @@ ext {
// -------------- 业务模块 -------------- // -------------- 业务模块 --------------
//第三步 若干 //第三步 若干
"m-confide" : "0.0.28", "m-confide" : "0.0.29",
"m-consultant" : "0.0.39", "m-consultant" : "0.0.44",
"m-fm" : "0.0.20", "m-fm" : "0.0.21",
"m-user" : "0.0.33", "m-user" : "0.0.34",
// 接入flutter的模块 // 接入flutter的模块
"m-tests" : "0.0.11.10", "m-tests" : "0.0.12",
"m-muse" : "0.0.17.10", "m-muse" : "0.0.19",
"m-course" : "0.0.28.10", "m-course" : "0.0.30",
//-------------- 业务模块 API 层 -------------- //-------------- 业务模块 API 层 --------------
"m-audioim-api" : "0.0.5", "m-audioim-api" : "0.0.5",
...@@ -64,13 +64,13 @@ ext { ...@@ -64,13 +64,13 @@ ext {
//-------------- 功能组件 -------------- //-------------- 功能组件 --------------
//第一步 //第一步
"ydl-platform" : "0.0.26", "ydl-platform" : "0.0.27",
//第二步 若干 //第二步 若干
"ydl-webview" : "0.0.27", "ydl-webview" : "0.0.28",
"ydl-media" : "0.0.13", "ydl-media" : "0.0.14",
"ydl-pay" : "0.0.10", "ydl-pay" : "0.0.11",
"m-audioim" : "0.0.28", "m-audioim" : "0.0.29",
//以下 几乎不会动 //以下 几乎不会动
"router" : "0.0.1", "router" : "0.0.1",
...@@ -104,13 +104,13 @@ ext { ...@@ -104,13 +104,13 @@ ext {
//-------------- 功能组件 -------------- //-------------- 功能组件 --------------
//第一步 //第一步
"ydl-platform" : "0.0.26", "ydl-platform" : "0.0.27",
//第二步 若干 //第二步 若干
"ydl-webview" : "0.0.27", "ydl-webview" : "0.0.28",
"ydl-media" : "0.0.13", "ydl-media" : "0.0.14",
"ydl-pay" : "0.0.10", "ydl-pay" : "0.0.11",
"m-audioim" : "0.0.28", "m-audioim" : "0.0.29",
//以下 几乎不会动 //以下 几乎不会动
......
...@@ -312,7 +312,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres ...@@ -312,7 +312,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
image_scroll_top.setOnClickListener(this) image_scroll_top.setOnClickListener(this)
// initStatus() // initStatus()
ConsultAssistantDialogUtils.INSTANCE.fitRequest(this, "doctor_list") ConsultAssistantDialogUtils.INSTANCE.fitRequest(this, "doctor_list", true)
} }
private fun initNetLossView() { private fun initNetLossView() {
...@@ -999,7 +999,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres ...@@ -999,7 +999,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
} else { } else {
updateFilterTextViewStatus(tvFilter, FILTER_STATUS_NORMAL) updateFilterTextViewStatus(tvFilter, FILTER_STATUS_NORMAL)
} }
ConsultAssistantDialogUtils.INSTANCE.fitRequest(this, "doctor_list") ConsultAssistantDialogUtils.INSTANCE.fitRequest(this, "doctor_list", true)
} }
filterPopupWindow.isClippingEnabled = false filterPopupWindow.isClippingEnabled = false
filterPopupWindow.showAtLocation(viewSep2.rootView, Gravity.TOP + Gravity.RIGHT, 0, 0) filterPopupWindow.showAtLocation(viewSep2.rootView, Gravity.TOP + Gravity.RIGHT, 0, 0)
...@@ -1478,6 +1478,6 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres ...@@ -1478,6 +1478,6 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
ConsultAssistantDialogUtils.INSTANCE.resetStatus() ConsultAssistantDialogUtils.INSTANCE.expertSearchResetStatus()
} }
} }
...@@ -208,7 +208,7 @@ class ExpertSearchAdapter(private val context: Context, private val expertSearch ...@@ -208,7 +208,7 @@ class ExpertSearchAdapter(private val context: Context, private val expertSearch
//私聊文案 //私聊文案
if (TextUtils.isEmpty(itemBean.chatBtnText)){ if (TextUtils.isEmpty(itemBean.chatBtnText)){
holder.tvChat.text = "私聊" holder.tvChat.text = "私聊"
holder.tvChat.setTextColor(ContextCompat.getColor(context,R.color.white)) holder.tvChat.setTextColor(ContextCompat.getColor(context,R.color.consultant_confirm_text_color))
holder.tvChat.background = ContextCompat.getDrawable(context,R.drawable.consultant_expert_search_chat) holder.tvChat.background = ContextCompat.getDrawable(context,R.drawable.consultant_expert_search_chat)
}else{ }else{
holder.tvChat.text = itemBean.chatBtnText holder.tvChat.text = itemBean.chatBtnText
......
...@@ -2,6 +2,7 @@ package com.yidianling.consultant.modular.singlton ...@@ -2,6 +2,7 @@ package com.yidianling.consultant.modular.singlton
import android.app.Activity import android.app.Activity
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import com.ydl.ydlcommon.utils.YdlBuryPointUtil
import com.yidianling.common.tools.ToastUtil import com.yidianling.common.tools.ToastUtil
import com.yidianling.consultant.dialog.ConsultAssistantDialog import com.yidianling.consultant.dialog.ConsultAssistantDialog
import com.yidianling.consultant.model.SearchApi import com.yidianling.consultant.model.SearchApi
...@@ -21,16 +22,19 @@ class ConsultAssistantDialogUtils private constructor() { ...@@ -21,16 +22,19 @@ class ConsultAssistantDialogUtils private constructor() {
} }
var consultAssistantDialogFromHomePage: ConsultAssistantDialog? = null // 首页展示的dialog var consultAssistantDialogFromHomePage: ConsultAssistantDialog? = null // 首页展示的dialog
var consultAssistantDialog: ConsultAssistantDialog? = null //咨询师列表页面展示的dialog var consultAssistantFragmentDialog: ConsultAssistantDialog? = null //咨询师列表fragment页面展示的dialog
var expertSearchPageHasShown: Boolean = false // 专家咨询列表页面是否已经展示 var expertSearchPageHasShown: Boolean = false // 专家咨询列表fragment页面是否已经展示
var consultAssistantActivityDialog: ConsultAssistantDialog? = null //咨询师列表activity页面展示的dialog
var expertSearchActivityPageHasShown: Boolean = false // 专家咨询列表activity页面是否已经展示
var timer: Timer? = null var timer: Timer? = null
/** /**
*判断是否符合代码展示逻辑 *判断是否符合代码展示逻辑
* origin 展示请求来源 首页 home_index 咨询列表 doctor_list * origin 展示请求来源 首页 home_index 咨询列表 doctor_list
* fromActivity 默认不是来自于咨询师列表activity
*/ */
fun fitRequest(activity: Activity, origin: String) { fun fitRequest(activity: Activity, origin: String, fromActivity: Boolean = false) {
when (origin) { when (origin) {
"home_index" -> { "home_index" -> {
if (ConsultantIn.isLogin() && if (ConsultantIn.isLogin() &&
...@@ -40,7 +44,9 @@ class ConsultAssistantDialogUtils private constructor() { ...@@ -40,7 +44,9 @@ class ConsultAssistantDialogUtils private constructor() {
} }
} }
"doctor_list" -> { "doctor_list" -> {
shouldShowDialog(activity, origin) if (!ConsultantIn.isLogin() || (ConsultantIn.getUserImpl().getUserInfo()?.user_type == 1 && ConsultantIn.isLogin())) {
shouldShowDialog(activity, origin, fromActivity = fromActivity)
}
} }
} }
...@@ -49,7 +55,7 @@ class ConsultAssistantDialogUtils private constructor() { ...@@ -49,7 +55,7 @@ class ConsultAssistantDialogUtils private constructor() {
/** /**
* 判断是否符合接口展示逻辑 * 判断是否符合接口展示逻辑
*/ */
private fun shouldShowDialog(activity: Activity, origin: String, isDelay: Boolean = false) { private fun shouldShowDialog(activity: Activity, origin: String, isDelay: Boolean = false, fromActivity: Boolean = false) {
// 请求接口判断导医咨询助理按钮是否展示 // 请求接口判断导医咨询助理按钮是否展示
SearchApi.getSearchApi().getConsultAssistantRequest(origin) SearchApi.getSearchApi().getConsultAssistantRequest(origin)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
...@@ -59,7 +65,7 @@ class ConsultAssistantDialogUtils private constructor() { ...@@ -59,7 +65,7 @@ class ConsultAssistantDialogUtils private constructor() {
if (origin == "home_index") { if (origin == "home_index") {
showFromYdlHome(activity) showFromYdlHome(activity)
} else if (origin == "doctor_list") { } else if (origin == "doctor_list") {
show(activity) show(activity, fromActivity)
} }
} }
} }
...@@ -78,6 +84,7 @@ class ConsultAssistantDialogUtils private constructor() { ...@@ -78,6 +84,7 @@ class ConsultAssistantDialogUtils private constructor() {
object : ConsultAssistantDialog.OnConsultAssistantClickListener { object : ConsultAssistantDialog.OnConsultAssistantClickListener {
override fun onClickAction() { override fun onClickAction() {
//获取用户uid //获取用户uid
YdlBuryPointUtil.sendClick("home_page_assistant_click")
getConsultAssistantUid(activity) getConsultAssistantUid(activity)
} }
...@@ -100,8 +107,9 @@ class ConsultAssistantDialogUtils private constructor() { ...@@ -100,8 +107,9 @@ class ConsultAssistantDialogUtils private constructor() {
/** /**
* 咨询师列表页展示 * 咨询师列表页展示
*/ */
fun show(activity: Activity) { fun show(activity: Activity, fromActivity: Boolean = false) {
// 来自于fragment咨询师列表
if (!fromActivity) {
if (!expertSearchPageHasShown && timer == null) { if (!expertSearchPageHasShown && timer == null) {
timer = Timer() timer = Timer()
timer!!.schedule(object : TimerTask() { timer!!.schedule(object : TimerTask() {
...@@ -116,18 +124,36 @@ class ConsultAssistantDialogUtils private constructor() { ...@@ -116,18 +124,36 @@ class ConsultAssistantDialogUtils private constructor() {
} else { } else {
showDialog(activity) showDialog(activity)
} }
}else {// 来自于activity咨询师列表
if (!expertSearchActivityPageHasShown && timer == null) {
timer = Timer()
timer!!.schedule(object : TimerTask() {
override fun run() {
Observable.just(1).observeOn(AndroidSchedulers.mainThread())
.subscribe {
expertSearchActivityPageHasShown = true
showDialog(activity, true)
}
}
}, 5000)
} else {
showDialog(activity, true)
}
}
} }
/** /**
* 咨询师列表页展示浮层 * 咨询师列表页展示浮层
*/ */
fun showDialog(activity: Activity) { fun showDialog(activity: Activity, fromActivity: Boolean = false) {
if (!fromActivity) {
if (!activity.isFinishing) { if (!activity.isFinishing) {
if (consultAssistantDialog == null) { if (consultAssistantFragmentDialog == null) {
consultAssistantDialog = ConsultAssistantDialog( consultAssistantFragmentDialog = ConsultAssistantDialog(
activity, activity,
object : ConsultAssistantDialog.OnConsultAssistantClickListener { object : ConsultAssistantDialog.OnConsultAssistantClickListener {
override fun onClickAction() { override fun onClickAction() {
YdlBuryPointUtil.sendClick("assistant_list_click")
// 咨询师列表页面且未登录情况下,跳转登录页面 // 咨询师列表页面且未登录情况下,跳转登录页面
if (!ConsultantIn.isLogin()) { if (!ConsultantIn.isLogin()) {
ConsultantIn.toLogin(activity) ConsultantIn.toLogin(activity)
...@@ -139,7 +165,29 @@ class ConsultAssistantDialogUtils private constructor() { ...@@ -139,7 +165,29 @@ class ConsultAssistantDialogUtils private constructor() {
}) })
} }
consultAssistantDialog?.show() consultAssistantFragmentDialog?.show()
}
}else {
if (!activity.isFinishing) {
if (consultAssistantActivityDialog == null) {
consultAssistantActivityDialog = ConsultAssistantDialog(
activity,
object : ConsultAssistantDialog.OnConsultAssistantClickListener {
override fun onClickAction() {
YdlBuryPointUtil.sendClick("assistant_list_click")
// 咨询师列表页面且未登录情况下,跳转登录页面
if (!ConsultantIn.isLogin()) {
ConsultantIn.toLogin(activity)
} else {
//获取用户uid
getConsultAssistantUid(activity)
}
}
})
}
consultAssistantActivityDialog?.show()
}
} }
} }
...@@ -148,20 +196,36 @@ class ConsultAssistantDialogUtils private constructor() { ...@@ -148,20 +196,36 @@ class ConsultAssistantDialogUtils private constructor() {
* 咨询师列表页隐藏 * 咨询师列表页隐藏
*/ */
fun hide() { fun hide() {
consultAssistantDialog?.hide() consultAssistantFragmentDialog?.hide()
} }
/** /**
* 咨询师列表页面使用的重置本单例关于专家咨询列表页面得状态 * 释放本单例所有资源(咨询师列表fragmnet在MainActivity,
* 且在MainActivity销毁的时候,会先执行咨询师列表fragmnet
* 的ondeatroy,所以这边直接在该专家咨询列表碎片执行该方法)
*/ */
fun resetStatus() { fun resetStatus() {
consultAssistantDialogFromHomePage?.dismiss() consultAssistantDialogFromHomePage?.dismiss()
consultAssistantDialog?.dismiss() consultAssistantFragmentDialog?.dismiss()
consultAssistantActivityDialog?.dismiss()
timer?.cancel() timer?.cancel()
timer = null timer = null
expertSearchPageHasShown = false expertSearchPageHasShown = false
expertSearchActivityPageHasShown = false
consultAssistantDialogFromHomePage = null consultAssistantDialogFromHomePage = null
consultAssistantDialog = null consultAssistantFragmentDialog = null
consultAssistantActivityDialog = null
}
/**
* 咨询师列表activity页面使用的重置本单例关于专家咨询列表页面得状态
*/
fun expertSearchResetStatus() {
consultAssistantActivityDialog?.dismiss()
timer?.cancel()
timer = null
expertSearchActivityPageHasShown = false
consultAssistantActivityDialog = null
} }
////////////////////////////////////// 咨询师列表页面的展示隐藏逻辑 代码块end /////////////////////////////////////////////////// ////////////////////////////////////// 咨询师列表页面的展示隐藏逻辑 代码块end ///////////////////////////////////////////////////
......
...@@ -49,7 +49,7 @@ class FlutterCourseHomeFragment : BaseFlutterFragment() { ...@@ -49,7 +49,7 @@ class FlutterCourseHomeFragment : BaseFlutterFragment() {
} }
override fun initialRoute(): String { override fun initialRoute(): String {
return "native/course/home" return "course/home"
} }
override fun setUserVisibleHint(isVisibleToUser: Boolean) { override fun setUserVisibleHint(isVisibleToUser: Boolean) {
......
...@@ -139,7 +139,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler ...@@ -139,7 +139,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
filter_layout.setTextColor( filter_layout.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
this@CourseListContainerActivity, this@CourseListContainerActivity,
R.color.course_color_1DA1F2 R.color.main_theme
) )
) )
} else { } else {
...@@ -233,7 +233,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler ...@@ -233,7 +233,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
classify_layout.setTextColor( classify_layout.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
this@CourseListContainerActivity, this@CourseListContainerActivity,
R.color.course_color_1DA1F2 R.color.main_theme
) )
) )
} else { } else {
...@@ -330,7 +330,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler ...@@ -330,7 +330,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
classify_layout.setTextColor( classify_layout.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
this@CourseListContainerActivity, this@CourseListContainerActivity,
R.color.course_color_1DA1F2 R.color.main_theme
) )
) )
} else { } else {
...@@ -352,7 +352,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler ...@@ -352,7 +352,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
classify_layout.setTextColor( classify_layout.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
this@CourseListContainerActivity, this@CourseListContainerActivity,
R.color.course_color_1DA1F2 R.color.main_theme
) )
) )
classify_layout.setCompoundDrawablesWithIntrinsicBounds( classify_layout.setCompoundDrawablesWithIntrinsicBounds(
...@@ -399,7 +399,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler ...@@ -399,7 +399,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
filter_layout.setTextColor( filter_layout.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
this@CourseListContainerActivity, this@CourseListContainerActivity,
R.color.course_color_1DA1F2 R.color.main_theme
) )
) )
} else { } else {
...@@ -421,7 +421,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler ...@@ -421,7 +421,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
filter_layout.setTextColor( filter_layout.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
this@CourseListContainerActivity, this@CourseListContainerActivity,
R.color.course_color_1DA1F2 R.color.main_theme
) )
) )
filter_layout.setCompoundDrawablesWithIntrinsicBounds( filter_layout.setCompoundDrawablesWithIntrinsicBounds(
...@@ -642,7 +642,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler ...@@ -642,7 +642,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
classify_layout.setTextColor( classify_layout.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
this@CourseListContainerActivity, this@CourseListContainerActivity,
R.color.course_color_1DA1F2 R.color.main_theme
) )
) )
} else { } else {
...@@ -689,7 +689,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler ...@@ -689,7 +689,7 @@ class CourseListContainerActivity : BaseActivity(), PtrHandler, LoadMoreHandler
filter_layout.setTextColor( filter_layout.setTextColor(
ContextCompat.getColor( ContextCompat.getColor(
this@CourseListContainerActivity, this@CourseListContainerActivity,
R.color.course_color_1DA1F2 R.color.main_theme
) )
) )
} else { } else {
......
...@@ -15,7 +15,7 @@ import org.json.JSONObject ...@@ -15,7 +15,7 @@ import org.json.JSONObject
@Route(path = "/module/muse") @Route(path = "/module/muse")
class MuseActivity : BaseFlutterActivity() { class MuseActivity : BaseFlutterActivity() {
override fun initialRoute(): String { override fun initialRoute(): String {
return "native/muse/home" return "muse/home"
} }
override fun initChannelPlugin(jsonObject: JSONObject) { override fun initChannelPlugin(jsonObject: JSONObject) {
......
...@@ -2,6 +2,7 @@ package com.ydl.ydlnet.builder.config; ...@@ -2,6 +2,7 @@ package com.ydl.ydlnet.builder.config;
import android.content.Context; import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import com.ydl.ydlnet.builder.cookie.CookieJarImpl; import com.ydl.ydlnet.builder.cookie.CookieJarImpl;
import com.ydl.ydlnet.builder.cookie.store.CookieStore; import com.ydl.ydlnet.builder.cookie.store.CookieStore;
import com.ydl.ydlnet.builder.factory.ApiFactory; import com.ydl.ydlnet.builder.factory.ApiFactory;
...@@ -9,19 +10,22 @@ import com.ydl.ydlnet.builder.http.SSLUtils; ...@@ -9,19 +10,22 @@ import com.ydl.ydlnet.builder.http.SSLUtils;
import com.ydl.ydlnet.builder.interceptor.HeaderInterceptor; import com.ydl.ydlnet.builder.interceptor.HeaderInterceptor;
import com.ydl.ydlnet.builder.interceptor.NetCacheInterceptor; import com.ydl.ydlnet.builder.interceptor.NetCacheInterceptor;
import com.ydl.ydlnet.builder.interceptor.NoNetCacheInterceptor; import com.ydl.ydlnet.builder.interceptor.NoNetCacheInterceptor;
import com.ydl.ydlnet.builder.interceptor.log.RequestHandler;
import com.ydl.ydlnet.builder.interceptor.log.RequestLogInterceptor; import com.ydl.ydlnet.builder.interceptor.log.RequestLogInterceptor;
import com.ydl.ydlnet.builder.manage.HttpUrlManager; import com.ydl.ydlnet.builder.manage.HttpUrlManager;
import com.ydl.ydlnet.client.interfaces.BuildHeadersListener; import com.ydl.ydlnet.client.interfaces.BuildHeadersListener;
import okhttp3.Cache;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import javax.net.ssl.HostnameVerifier;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.net.ssl.HostnameVerifier;
import okhttp3.Cache;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
/** /**
* Created by haorui on 2019-09-02 . * Created by haorui on 2019-09-02 .
* Des: 统一OkHttp配置信息 * Des: 统一OkHttp配置信息
...@@ -80,6 +84,7 @@ public class OkHttpConfig { ...@@ -80,6 +84,7 @@ public class OkHttpConfig {
private InputStream bksFile; private InputStream bksFile;
private String password; private String password;
private InputStream[] certificates; private InputStream[] certificates;
private RequestHandler requestHandler;
private Interceptor[] interceptors; private Interceptor[] interceptors;
private Interceptor[] netInterceptors; private Interceptor[] netInterceptors;
private BuildHeadersListener buildHeadersListener; private BuildHeadersListener buildHeadersListener;
...@@ -99,6 +104,11 @@ public class OkHttpConfig { ...@@ -99,6 +104,11 @@ public class OkHttpConfig {
return this; return this;
} }
public Builder setRequestHandler(RequestHandler requestHandler) {
this.requestHandler= requestHandler;
return this;
}
public Builder setCache(boolean isCache) { public Builder setCache(boolean isCache) {
this.isCache = isCache; this.isCache = isCache;
return this; return this;
...@@ -210,9 +220,7 @@ public class OkHttpConfig { ...@@ -210,9 +220,7 @@ public class OkHttpConfig {
* 配置开发环境 * 配置开发环境
*/ */
private void setDebugConfig() { private void setDebugConfig() {
if (isDebug) { okHttpClientBuilder.addInterceptor(new RequestLogInterceptor(isDebug,requestHandler));
okHttpClientBuilder.addInterceptor(new RequestLogInterceptor());
}
} }
......
package com.ydl.ydlnet.builder.interceptor.log;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
/**
* Created by haorui on 2019-11-26 .
* Des:
*/
public interface RequestHandler {
Response onHttpResultResponse(String httpResult, Interceptor.Chain chain, Response response);
Request onHttpRequestBefore(Interceptor.Chain chain, Request request);
RequestHandler EMPTY = new RequestHandler() {
@Override
public Response onHttpResultResponse(String httpResult, Interceptor.Chain chain, Response response) {
//不管是否处理,都必须将response返回出去
return response;
}
@Override
public Request onHttpRequestBefore(Interceptor.Chain chain, Request request) {
//不管是否处理,都必须将request返回出去
return request;
}
};
}
package com.ydl.ydlnet.builder.interceptor.log; package com.ydl.ydlnet.builder.interceptor.log;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import com.ydl.ydlnet.utils.CharacterHandler; import com.ydl.ydlnet.utils.CharacterHandler;
import com.ydl.ydlnet.utils.NetLogUtils; import com.ydl.ydlnet.utils.NetLogUtils;
import com.ydl.ydlnet.utils.UrlEncoderUtils; import com.ydl.ydlnet.utils.UrlEncoderUtils;
import com.ydl.ydlnet.utils.ZipHelper; import com.ydl.ydlnet.utils.ZipHelper;
import okhttp3.*;
import okio.Buffer;
import okio.BufferedSource;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
...@@ -15,14 +13,27 @@ import java.net.URLDecoder; ...@@ -15,14 +13,27 @@ import java.net.URLDecoder;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;
/** /**
* Created by haorui on 2019-09-01 . * Created by haorui on 2019-09-01 .
* Des: 解析框架中的网络请求和响应结果并打印 * Des: 解析框架中的网络请求和响应结果并打印
*/ */
public class RequestLogInterceptor implements Interceptor { public class RequestLogInterceptor implements Interceptor {
private DefaultFormatPrinter mPrinter = new DefaultFormatPrinter(); private DefaultFormatPrinter mPrinter = new DefaultFormatPrinter();
private boolean mIsDebug ;
private RequestHandler mRequestHandler;
public RequestLogInterceptor() { public RequestLogInterceptor(boolean isDebug, RequestHandler requestHandler) {
this.mIsDebug = isDebug;
this.mRequestHandler = requestHandler;
} }
@Override @Override
...@@ -36,6 +47,8 @@ public class RequestLogInterceptor implements Interceptor { ...@@ -36,6 +47,8 @@ public class RequestLogInterceptor implements Interceptor {
mPrinter.printFileRequest(request); mPrinter.printFileRequest(request);
} }
if (mRequestHandler != null)
request = mRequestHandler.onHttpRequestBefore(chain, request);
long t1 =System.nanoTime() ; long t1 =System.nanoTime() ;
Response originalResponse; Response originalResponse;
...@@ -55,6 +68,10 @@ public class RequestLogInterceptor implements Interceptor { ...@@ -55,6 +68,10 @@ public class RequestLogInterceptor implements Interceptor {
bodyString = printResult(request, originalResponse); bodyString = printResult(request, originalResponse);
} }
if (mRequestHandler != null)
mRequestHandler.onHttpResultResponse(bodyString, chain, originalResponse);
if(mIsDebug) {
final List<String> segmentList = request.url().encodedPathSegments(); final List<String> segmentList = request.url().encodedPathSegments();
final String header = originalResponse.headers().toString(); final String header = originalResponse.headers().toString();
final int code = originalResponse.code(); final int code = originalResponse.code();
...@@ -69,6 +86,7 @@ public class RequestLogInterceptor implements Interceptor { ...@@ -69,6 +86,7 @@ public class RequestLogInterceptor implements Interceptor {
mPrinter.printFileResponse(TimeUnit.NANOSECONDS.toMillis(t2 - t1), mPrinter.printFileResponse(TimeUnit.NANOSECONDS.toMillis(t2 - t1),
isSuccessful, code, header, segmentList, message, url); isSuccessful, code, header, segmentList, message, url);
} }
}
return originalResponse; return originalResponse;
} }
......
...@@ -83,7 +83,8 @@ dependencies { ...@@ -83,7 +83,8 @@ dependencies {
api rootProject.ext.dependencies["ydl-utils"] api rootProject.ext.dependencies["ydl-utils"]
api rootProject.ext.dependencies["ydl-js"] api rootProject.ext.dependencies["ydl-js"]
api rootProject.ext.dependencies["ydl-net"] // api rootProject.ext.dependencies["ydl-net"]
api project(':ydl-net')
api rootProject.ext.dependencies["ydl-js"] api rootProject.ext.dependencies["ydl-js"]
api rootProject.ext.dependencies["ptr-lib-release"] api rootProject.ext.dependencies["ptr-lib-release"]
api(rootProject.ext.dependencies["ydl-device"]) { api(rootProject.ext.dependencies["ydl-device"]) {
......
...@@ -91,6 +91,7 @@ class GlobalConfig private constructor(var builder: Builder) { ...@@ -91,6 +91,7 @@ class GlobalConfig private constructor(var builder: Builder) {
} }
apiFactory.setOkClient(okHttpClient) apiFactory.setOkClient(okHttpClient)
HttpConfig.getInstance().initAuth()
} }
} }
......
package com.ydl.ydlcommon.base.config package com.ydl.ydlcommon.base.config
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.text.TextUtils import android.text.TextUtils
import com.facebook.stetho.okhttp3.StethoInterceptor import com.facebook.stetho.okhttp3.StethoInterceptor
import com.ydl.ydlcommon.base.BaseApp import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.bean.AuthBean
import com.ydl.ydlcommon.data.PlatformDataManager import com.ydl.ydlcommon.data.PlatformDataManager
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.EncryptUtils import com.ydl.ydlcommon.data.http.EncryptUtils
import com.ydl.ydlcommon.data.http.GsonProvider
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.data.http.api.ApiRequestUtil
import com.ydl.ydlcommon.modular.ModularServiceManager import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.utils.YDLCacheUtils import com.ydl.ydlcommon.utils.YDLCacheUtils
import com.ydl.ydlnet.builder.config.OkHttpConfig import com.ydl.ydlnet.builder.config.OkHttpConfig
import com.ydl.ydlnet.builder.interceptor.log.RequestHandler
import com.yidianling.common.tools.LogUtil
import com.yidianling.common.tools.RxAppTool import com.yidianling.common.tools.RxAppTool
import com.yidianling.common.tools.RxDeviceTool import com.yidianling.common.tools.RxDeviceTool
import okhttp3.FormBody import com.yidianling.common.tools.ToastUtil
import okhttp3.Interceptor import okhttp3.*
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okio.Buffer import okio.Buffer
import okio.BufferedSink import okio.BufferedSink
import java.util.* import java.util.*
import kotlin.collections.ArrayList
/** /**
...@@ -37,7 +38,10 @@ class HttpConfig { ...@@ -37,7 +38,10 @@ class HttpConfig {
//====================应用默认配置==================== //====================应用默认配置====================
private const val AUTHORIZATION_NAME = "Authorization" private const val AUTHORIZATION_NAME = "Authorization"
private const val AUTHORIZATION_JAVA_NAME = "AuthorizationJava"
private const val SESSION_KEY = "dc59cf294f37d237c1f06240568ffe21" private const val SESSION_KEY = "dc59cf294f37d237c1f06240568ffe21"
private var DYNAMIC_SESSION_KEY :String= "dc59cf294f37d237c1f06240568ffe21"
private const val YDL = "Ydl" private const val YDL = "Ydl"
private const val UID = "uid" private const val UID = "uid"
private const val FFROM = "ffrom" private const val FFROM = "ffrom"
...@@ -48,6 +52,8 @@ class HttpConfig { ...@@ -48,6 +52,8 @@ class HttpConfig {
private const val TOKEN = "accessToken" private const val TOKEN = "accessToken"
private val OS_TYPE = "osType"// 1.ios 2.android private val OS_TYPE = "osType"// 1.ios 2.android
private val APP_NAME = "appName"//用于标识 是哪个应用 yidianling:用户版 xinlizixun:心理咨询 haoshi:情感壹点灵 zhuanjia:专家版 private val APP_NAME = "appName"//用于标识 是哪个应用 yidianling:用户版 xinlizixun:心理咨询 haoshi:情感壹点灵 zhuanjia:专家版
//验证签名失败
private val AUTH_INEFFECTIVE_CODE = "-201"
//====================网络环境==================== //====================网络环境====================
...@@ -80,6 +86,7 @@ class HttpConfig { ...@@ -80,6 +86,7 @@ class HttpConfig {
return builder return builder
.setInterceptor(commonParams(),requestHead(appFrom)) .setInterceptor(commonParams(),requestHead(appFrom))
.setRequestHandler(getRequestHandler())
.setReadTimeout(15) .setReadTimeout(15)
.setWriteTimeout(15) .setWriteTimeout(15)
.setConnectTimeout(15) .setConnectTimeout(15)
...@@ -87,6 +94,35 @@ class HttpConfig { ...@@ -87,6 +94,35 @@ class HttpConfig {
.build() .build()
} }
private fun getRequestHandler():RequestHandler{
return object :RequestHandler{
override fun onHttpResultResponse(
httpResult: String,
chain: Interceptor.Chain,
response: Response
): Response {
val gson = GsonProvider.getGson()
val resultData= gson.fromJson(httpResult, BaseAPIResponse::class.java)
when (resultData.code) {
AUTH_INEFFECTIVE_CODE -> {
//签证签名失败
ToastUtil.toastShort(resultData.msg)
//更新动态密钥
if (resultData.data!=null){
var authBean = gson.fromJson<AuthBean>(gson.toJson(resultData.data),AuthBean::class.java)
DYNAMIC_SESSION_KEY = authBean?.appKey.toString()
}
}
}
return response
}
override fun onHttpRequestBefore(chain: Interceptor.Chain?, request: Request): Request {
return request
}
}
}
// 添加公共参数 // 添加公共参数
private fun commonParams(): Interceptor { private fun commonParams(): Interceptor {
...@@ -95,34 +131,25 @@ class HttpConfig { ...@@ -95,34 +131,25 @@ class HttpConfig {
//如果是POST请求,则再在Body中增加公共参数 //如果是POST请求,则再在Body中增加公共参数
if ("POST"==request.method()){ if ("POST"==request.method()){
var body = request.body() var body = request.body()
if (body is FormBody) { if (body is FormBody) {
val paramsName = mutableSetOf<String>()
val bodyBuild = FormBody.Builder() val bodyBuild = FormBody.Builder()
for (i in 0 until body.size()) { for (i in 0 until body.size()) {
val name = body.name(i) val name = body.name(i)
paramsName.add(name)
val value = body.value(i) val value = body.value(i)
// 去除假参数和值为空的参数 // 去除假参数和值为空的参数
if (YDLConstants.HOLDER_PARAM != name && !TextUtils.isEmpty(value)) { if (YDLConstants.HOLDER_PARAM != name && !TextUtils.isEmpty(value)) {
bodyBuild.addEncoded(name, value) bodyBuild.addEncoded(name, value)
} }
} }
bodyBuild.addEncoded(FFROM, PlatformDataManager.getRam().getChannelName())
.addEncoded(IS_FROM_APP, "1") val paramsValue = getCommonParams(paramsName)
.addEncoded(
OS_BUILD, paramsValue.forEach { entry->
"""${RxDeviceTool.getBuildBrandModel()},${RxDeviceTool.getSDKVersionName()},${RxAppTool.getAppVersionName( bodyBuild.addEncoded(entry.key,entry.value)
BaseApp.getApp()
)}"""
)
.addEncoded(TS, (System.currentTimeMillis() / 1000).toString())
.addEncoded(
VERSION, RxAppTool.getAppVersionName(
BaseApp.getApp()
)
)
val loginBean = ModularServiceManager.getPlatformUserService()?.getUser()
if (loginBean != null) {
bodyBuild.addEncoded(UID, loginBean.userId)
bodyBuild.addEncoded(TOKEN, loginBean.token)
} }
body = bodyBuild.build() body = bodyBuild.build()
...@@ -132,34 +159,11 @@ class HttpConfig { ...@@ -132,34 +159,11 @@ class HttpConfig {
val url = request.url() val url = request.url()
val newBuilder = url.newBuilder() val newBuilder = url.newBuilder()
// for (i in 0 until url.querySize()) { val paramsName = url.queryParameterNames()
// //取出url中?后的参数 val paramsValue = getCommonParams(paramsName)
// val key = url.queryParameterName(i) paramsValue.forEach { entry->
// val value = url.queryParameterValue(i)
// newBuilder.
// addQueryParameter(key, value)
// }
newBuilder. newBuilder.
addQueryParameter(FFROM, PlatformDataManager.getRam().getChannelName()) addQueryParameter(entry.key,entry.value)
.addQueryParameter(IS_FROM_APP, "1")
.addQueryParameter(
OS_BUILD,
"""${RxDeviceTool.getBuildBrandModel()},${RxDeviceTool.getSDKVersionName()},${RxAppTool.getAppVersionName(
BaseApp.getApp()
)}"""
)
.addQueryParameter(TS, (System.currentTimeMillis() / 1000).toString())
.addQueryParameter(
VERSION, RxAppTool.getAppVersionName(
BaseApp.getApp()
)
)
val loginBean = ModularServiceManager.getPlatformUserService()?.getUser()
if (loginBean != null) {
newBuilder.addQueryParameter(UID, loginBean.userId)
.addQueryParameter(TOKEN, loginBean.token)
} }
it.proceed(request.newBuilder().url(newBuilder.build()).build()) it.proceed(request.newBuilder().url(newBuilder.build()).build())
...@@ -170,6 +174,43 @@ class HttpConfig { ...@@ -170,6 +174,43 @@ class HttpConfig {
} }
} }
/**
* 获取公共参数
* 在原有请求中没有该参数的情况下才添加
*/
private fun getCommonParams(paramsName: MutableSet<String>): HashMap<String, String> {
val paramsValue = hashMapOf<String, String>()
if (!paramsName.contains(FFROM)) {
paramsValue[FFROM] = PlatformDataManager.getRam().getChannelName()
}
if (!paramsName.contains(IS_FROM_APP)) {
paramsValue[IS_FROM_APP] = "1"
}
if (!paramsName.contains(OS_BUILD)) {
paramsValue[OS_BUILD] =
"""${RxDeviceTool.getBuildBrandModel()},${RxDeviceTool.getSDKVersionName()},${RxAppTool.getAppVersionName(
BaseApp.getApp()
)}"""
}
if (!paramsName.contains(TS)) {
paramsValue[TS] = (System.currentTimeMillis() / 1000).toString()
}
if (!paramsName.contains(VERSION)) {
paramsValue[VERSION] = RxAppTool.getAppVersionName(
BaseApp.getApp()
)
}
val loginBean = ModularServiceManager.getPlatformUserService()?.getUser()
if (loginBean != null && !paramsName.contains(UID)) {
paramsValue[UID] = loginBean.userId
}
if (loginBean != null && !paramsName.contains(TOKEN)) {
paramsValue[TOKEN] = loginBean.token
}
return paramsValue
}
private data class Param(val name: String, val value: String) private data class Param(val name: String, val value: String)
...@@ -202,6 +243,7 @@ class HttpConfig { ...@@ -202,6 +243,7 @@ class HttpConfig {
} }
} }
} }
params.sortWith(Comparator { o1, o2 -> params.sortWith(Comparator { o1, o2 ->
val res = o1.name.compareTo(o2.name) val res = o1.name.compareTo(o2.name)
when { when {
...@@ -214,14 +256,14 @@ class HttpConfig { ...@@ -214,14 +256,14 @@ class HttpConfig {
if (index != 0) paramsString.append("&") if (index != 0) paramsString.append("&")
paramsString.append("${param.name}=${param.value}") paramsString.append("${param.name}=${param.value}")
} }
paramsString.append(SESSION_KEY)
val head = "$YDL ${EncryptUtils.encryptMD5ToString( val oldAuth = getOldAuth(paramsString)
paramsString.toString() val newAuth = getNewAuth(paramsString)
)}"
val builder = it.request() val builder = it.request()
.newBuilder() .newBuilder()
.header(AUTHORIZATION_NAME, head) .header(AUTHORIZATION_NAME, oldAuth)
.header(AUTHORIZATION_JAVA_NAME, newAuth )
.addHeader("Connection", "close") .addHeader("Connection", "close")
.addHeader(FFROM, PlatformDataManager.getRam().getChannelName()) .addHeader(FFROM, PlatformDataManager.getRam().getChannelName())
.addHeader(IS_FROM_APP, "1") .addHeader(IS_FROM_APP, "1")
...@@ -243,6 +285,18 @@ class HttpConfig { ...@@ -243,6 +285,18 @@ class HttpConfig {
} }
} }
private fun getOldAuth(paramsString: StringBuilder): String {
paramsString.append(SESSION_KEY)
return "$YDL ${EncryptUtils.encryptMD5ToString(
paramsString.toString()
)}"
}
private fun getNewAuth(paramsString: StringBuilder): String {
//md5({静态秘钥} + {参数} + md5{动态秘钥(明文)}
return "$YDL ${EncryptUtils.encryptMD5ToString(SESSION_KEY+ paramsString.toString()+EncryptUtils.encryptMD5ToString(DYNAMIC_SESSION_KEY))}"
}
//初始化网络环境 //初始化网络环境
fun initEnv(c: Context, env: String) { fun initEnv(c: Context, env: String) {
var appEnv = env var appEnv = env
...@@ -271,6 +325,20 @@ class HttpConfig { ...@@ -271,6 +325,20 @@ class HttpConfig {
SERVER_COUPON_URL = properties.getProperty("javacouponurl.$appEnv") SERVER_COUPON_URL = properties.getProperty("javacouponurl.$appEnv")
} }
@SuppressLint("CheckResult")
fun initAuth(){
ApiRequestUtil.getDynamicToken()
.compose(RxUtils.applySchedulers())
.compose(RxUtils.resultJavaData())
.subscribe({
if (!TextUtils.isEmpty(it.appKey)){
DYNAMIC_SESSION_KEY = it?.appKey.toString()
}
}) {
LogUtil.i("HttpConfig", it.toString())
}
}
private object Holder { private object Holder {
val INSTANCE = HttpConfig() val INSTANCE = HttpConfig()
} }
......
package com.ydl.ydlcommon.bean
/**
* Created by haorui on 2019-11-26.
* Des:
*/
class AuthBean {
/**
* id : 1
* appId : android_zhuzhan
* appKey : 123456
* version : 4.0.00
*/
var id: Int = 0
var appId: String? = null
var appKey: String? = null
var version: String? = null
}
package com.ydl.ydlcommon.data.http.api; package com.ydl.ydlcommon.data.http.api;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.ydl.ydlcommon.bean.AuthBean;
import com.ydl.ydlcommon.bean.MustUP; import com.ydl.ydlcommon.bean.MustUP;
import com.ydl.ydlcommon.data.http.BaseAPIResponse; import com.ydl.ydlcommon.data.http.BaseAPIResponse;
import com.ydl.ydlcommon.data.http.BaseResponse; import com.ydl.ydlcommon.data.http.BaseResponse;
...@@ -8,12 +9,13 @@ import com.ydl.ydlcommon.data.http.FormatText; ...@@ -8,12 +9,13 @@ import com.ydl.ydlcommon.data.http.FormatText;
import com.ydl.ydlcommon.data.http.params.ActionDataBean; import com.ydl.ydlcommon.data.http.params.ActionDataBean;
import com.ydl.ydlcommon.utils.NetworkParamsUtils; import com.ydl.ydlcommon.utils.NetworkParamsUtils;
import com.ydl.ydlnet.YDLHttpUtils; import com.ydl.ydlnet.YDLHttpUtils;
import java.util.List;
import io.reactivex.Observable; import io.reactivex.Observable;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import java.util.List;
/** /**
* 模块请求工具类 * 模块请求工具类
* Created by hgw on 2018/1/23. * Created by hgw on 2018/1/23.
...@@ -39,4 +41,12 @@ public class ApiRequestUtil { ...@@ -39,4 +41,12 @@ public class ApiRequestUtil {
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), new Gson().toJson(actionDataParams)); RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), new Gson().toJson(actionDataParams));
return YDLHttpUtils.Companion.obtainApi(NetApiStore.class).actionDataCount(body); return YDLHttpUtils.Companion.obtainApi(NetApiStore.class).actionDataCount(body);
} }
/**
* 获取动态密钥
* @return
*/
public static Observable<BaseAPIResponse<AuthBean>> getDynamicToken() {
return YDLHttpUtils.Companion.obtainApi(NetApiStore.class).getDynamicToken();
}
} }
package com.ydl.ydlcommon.data.http.api; package com.ydl.ydlcommon.data.http.api;
import com.ydl.ydlcommon.bean.AuthBean;
import com.ydl.ydlcommon.bean.MustUP; import com.ydl.ydlcommon.bean.MustUP;
import com.ydl.ydlcommon.data.http.BaseAPIResponse; import com.ydl.ydlcommon.data.http.BaseAPIResponse;
import com.ydl.ydlcommon.data.http.BaseResponse; import com.ydl.ydlcommon.data.http.BaseResponse;
import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.*;
import java.util.Map; import java.util.Map;
import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import static com.ydl.ydlcommon.base.config.AppConfigKt.YDL_DOMAIN; import static com.ydl.ydlcommon.base.config.AppConfigKt.YDL_DOMAIN;
import static com.ydl.ydlcommon.base.config.AppConfigKt.YDL_DOMAIN_JAVA; import static com.ydl.ydlcommon.base.config.AppConfigKt.YDL_DOMAIN_JAVA;
...@@ -32,4 +38,8 @@ interface NetApiStore { ...@@ -32,4 +38,8 @@ interface NetApiStore {
@POST("data/bigdata/maidian/writeMaiDianData") @POST("data/bigdata/maidian/writeMaiDianData")
Observable<BaseAPIResponse<String>> actionDataCount(@Body RequestBody body); Observable<BaseAPIResponse<String>> actionDataCount(@Body RequestBody body);
@Headers(YDL_DOMAIN+ YDL_DOMAIN_JAVA)
@POST("risk/key/info")
Observable<BaseAPIResponse<AuthBean>> getDynamicToken();
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment