日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 多个url请求,[Android]Retrofit多base_url请求解决方案

發布時間:2025/4/5 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 多个url请求,[Android]Retrofit多base_url请求解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在項目中偶爾會碰到多base_url的情況,其實這個做法很討厭,但是后端又沒辦法才這樣做的,當使用retrofit作為網絡框架的時候,出現多base_url的情況又很麻煩,下面提供我解決的方案

在ApiService處

public static String URL_1="url_name:url_1";

public static String URL_2="url_name:url_2";

/**

* 登陸

*

* @param map

* @return

*/

@Headers({URL_1})

@FormUrlEncoded

@POST("/Account/Login/")

Observable> login(@FieldMap Map map);

/**

* 登出

*

* @param map

* @return

*/

@Headers({URL_2})

@FormUrlEncoded

@POST("/Account/Logout/")

Observable logout(@FieldMap Map map);

增加多url的headers,例如:url_1/url_2

然后在Retrofit的實體類中,增加Interceptor

Interceptor baseUrlInterceptor = new Interceptor() {

@Override

public Response intercept(Chain chain) throws IOException {

// 獲取request

Request request = chain.request();

// 從request中獲取原有的HttpUrl實例oldHttpUrl

HttpUrl oldHttpUrl = request.url();

// 獲取request的創建者builder

Request.Builder builder = request.newBuilder();

// 從request中獲取headers,通過給定的鍵url_name

List headerValues = request.headers("url_name");

if (headerValues != null && headerValues.size() > 0) {

// 如果有這個header,先將配置的header刪除,因此header僅用作app和okhttp之間使用

builder.removeHeader("url_name");

// 匹配獲得新的BaseUrl

String headerValue = headerValues.get(0);

Log.d("headerValue", headerValue);

HttpUrl newBaseUrl = null;

if ("url_1".equals(headerValue)) {

newBaseUrl = HttpUrl.parse(Constants.BASE_URL_1);

} else if ("url_2".equals(headerValue)) {

newBaseUrl = HttpUrl.parse(Constants.BASE_URL_2);

}else {

newBaseUrl = oldHttpUrl;

}

// 重建新的HttpUrl,修改需要修改的url部分

HttpUrl newFullUrl = oldHttpUrl

.newBuilder()

// 更換網絡協議

.scheme(newBaseUrl.scheme())

// 更換主機名

.host(newBaseUrl.host())

// 更換端口

.port(newBaseUrl.port())

.build();

// 重建這個request,通過builder.url(newFullUrl).build();

// 然后返回一個response至此結束修改

return chain.proceed(builder.url(newFullUrl).build());

}

return chain.proceed(request);

}

};

通過 String headerValue = headerValues.get(0); 獲得 headerValue 然后判斷 headerValue 的值去更改url,同理方法也能更改端口號等別的信息

然后在初始化OkHttpClient的時候將interceptor添加上

//初始化一個OkHttpClient

OkHttpClient.Builder builder = new OkHttpClient.Builder()

.connectTimeout(30000, TimeUnit.MILLISECONDS)

.readTimeout(30000, TimeUnit.MILLISECONDS)

.writeTimeout(30000, TimeUnit.MILLISECONDS);

builder.addInterceptor(interceptor);

builder.addInterceptor(baseUrlInterceptor);

OkHttpClient okHttpClient = builder.build();

interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

//使用該OkHttpClient創建一個Retrofit對象

mRetrofit = new Retrofit.Builder()

//添加Gson數據格式轉換器支持

.addConverterFactory(GsonConverterFactory.create())

//添加RxJava語言支持

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

//指定網絡請求client

.client(okHttpClient)

.baseUrl(BASE_URL)

.build();

最后再去試試網絡請求看看

result.png

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的android 多个url请求,[Android]Retrofit多base_url请求解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。