okhttp攔截器的使用------修改baseurl
有的時候做專案的時候會遇到呼叫介面的url和之前介面定義的url不一樣,很可能連retrofit已經設定好的baseurl都要換,但是retrofit並沒有提供修改baseurl的方法。那我們只能通過別的方式,比如通過攔截器修改baseurl
public class MainActivity extends AppCompatActivity {
private static String BASE_URL = "https://api.github.com/";
private static String BASE_URL_SINGLE = "http://news-at.zhihu.com/" ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
final GitHubService repo = retrofit.create(GitHubService.class);
((TextView) findViewById(R.id.tv1)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Call<List<Contributor>> call = repo.contributorsByAddConverterGetCall("square" , "retrofit");
call.enqueue(new Callback<List<Contributor>>() {
@Override
public void onResponse(Call<List<Contributor>> call, retrofit2.Response<List<Contributor>> response) {
List<Contributor> contributorList = response.body();
if (contributorList != null) {
for (Contributor contributor : contributorList) {
Log.e("login", contributor.getLogin());
Log.e("contributions", contributor.getContributions() + "");
}
}
}
@Override
public void onFailure(Call<List<Contributor>> call, Throwable t) {
}
});
}
});
((TextView) findViewById(R.id.tv2)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Call<News> call = repo.getRequest();
call.enqueue(new Callback<News>() {
@Override
public void onResponse(Call<News> call, retrofit2.Response<News> response) {
News news = response.body();
if (news != null) {
Log.e("date", news.getDate());
for (News.Story story : news.getStories()) {
Log.e("story", story.toString());
}
}
}
@Override
public void onFailure(Call<News> call, Throwable t) {
Log.e("onFailure", "onFailure");
}
});
}
});
}
}
service的程式碼
public interface GitHubService {
@GET("repos/{owner}/{repo}/contributors")
Call<List<Contributor>> contributorsByAddConverterGetCall(@Path("owner") String owner, @Path("repo") String repo);
@GET("api/4/news/latest")
Call<News> getRequest();//從伺服器端過濾資料,獲取傳入變數對應的資料
}
這是兩個聯網請求。因為baseurl不一致導致第二個textview點選以後請求出錯。我們的目的就是要修改bseurl來讓請求成功
第一步
在請求url上新增請求頭headers
@Headers({"baseurl:user"})//其實這裡新增什麼都無所謂的,主要是為了在攔截器裡面捕捉到新增的headers
@GET("api/4/news/latest")
Call<News> getRequest();//從伺服器端過濾資料,獲取傳入變數對應的資料
第二步
新增攔截器,捕捉到配置過的headers,然後再修改baseurl
class ChangeUrlIntercept implements Interceptor {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
//獲取request
Request request = chain.request();
//獲取request的建立者builder
Request.Builder builder = request.newBuilder();
//從request中獲取headers,通過給定的鍵url_name
List<String> headerValues = request.headers("baseurl");
if (headerValues != null && headerValues.size() > 0) {
//如果有這個header,先將配置的header刪除,因此header僅用作app和okhttp之間使用
builder.removeHeader("baseurl");
//從request中獲取原有的HttpUrl例項oldHttpUrl
HttpUrl oldHttpUrl = request.url();
//匹配獲得新的BaseUrl
String headerValue = headerValues.get(0);
HttpUrl newBaseUrl = null;
if ("user".equals(headerValue)) {
newBaseUrl = HttpUrl.parse(BASE_URL_SINGLE);
} 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());
} else {
return chain.proceed(request);
}
}
好了,這樣只要給retrofit重新配置上這個okhhtpclient就可以了
相關推薦
okhttp攔截器的使用------修改baseurl
有的時候做專案的時候會遇到呼叫介面的url和之前介面定義的url不一樣,很可能連retrofit已經設定好的baseurl都要換,但是retrofit並沒有提供修改baseurl的方法。那我們只能通過別的方式,比如通過攔截器修改baseurl public
Mybatis攔截器修改sql語句
攔截器介紹 MyBatis提供了一種外掛(plugin)的功能,雖然叫做外掛,但其實這是攔截器功能。 MyBatis 允許你在已對映語句執行過程中的某一點進行攔截呼叫。預設情況下,MyBatis 允許使用外掛來攔截的方法呼叫包括: Executor (update, q
基於mybatis 攔截器修改sql
背景:公司的分庫分表中介軟體有一個自定義路由的功能,即指定需要路由的表字尾,需要在sql尾部加一段引數來指向該表 因此寫了一個攔截器來實現這個功能,因此如果您需要利用攔截器來修改sql的話可以參考此方法 達到的效果:mybatis的 mapper上加上路由引數物件,攔
OkHttp攔截器新增頭部引數
搭建環境 … 其實以前的一篇攔截器和這篇差不多 :詳細步驟 攔截器程式碼: /** * date:2018/12/12 * author:輝(家輝輝輝) * function:攔截器 */ public class Util_interptor implements Int
springboot專案使用攔截器修改/新增前端傳輸到後臺header的Cookie引數
本質上來講,request請求當中的引數是無法更改的,也不能新增或者刪除。 但在後臺程式中,一般對request的引數的操作,都是通過request的getParameter、getParameterNames、getParameterValues等方法執行的;所以我們要是能重寫這些方法,就從側面改變了
okhttp攔截器新增請求頭
新建一個類UserAgentInterceptor實現Interceptor import java.io.IOException; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Re
OkHttp攔截器的寫法
private static OkHttpClient okHttpClient; private static Request request; private static RequestBody builder; private static Interceptor g
OkHttp-攔截器
下面是關於OkHttp-攔截器的介紹和程式碼,就只用一個類就可以實現OkHttp-攔截器的效果 1.建立一個HttpUtils 的類,在HttpUtils 中實現OkHttp-攔截器的具體方法 public class HttpUtils { //提供一個本地Http工具類
Android之okhttp攔截器的使用
上週在部門的技術分享會上簡單分享了一下使用okhttp攔截器的使用,趁著端午假期好好將內容整理整理,希望能夠幫助到其他的朋友 okhttp攔截器主要在以下幾種情況使用: 網路請求、響應日誌輸出 在Header中統一新增cookie、token 設定網路
自定義OKhttp攔截器 新增請求頭
新建一個類UserAgentInterceptor實現Interceptor import java.io.IOException; import okhttp3.Interceptor
struts2 攔截器修改request的parameters引數失敗的問題
為了解決struts2的xss(跨站指令碼攻擊)問題,我打算用struts2自帶的攔截器來過濾所有由request傳遞來的引數。 <?xml version="1.0" encodi
Rx系列學習筆記_使用okhttp攔截器統一處理返回請求
之前我們進行了一個簡單的請求。但是我們發現api的所以的Observable的型別都是要進行一個ResponseData包裹。ResponseData的程式碼如下: public class R
okHttp攔截器放在doGet和doPost請求中
public class OkHttp3Util { /** * 懶漢 安全 加同步 * 私有的靜態成員變數 只宣告不建立 * 私有的構造方法 * 提供返回例項的靜態方法 */ private static OkHttpClient okHtt
okhttp攔截器的使用
本篇介紹OkHttp的攔截器的使用。 首先我們需要了解什麼事攔截器。打個比方,鏢局押著一箱元寶在行走在一個山間小路上,突然從山上下來一群山賊攔住了鏢局的去路,將鏢局身上值錢的東西搜刮乾淨後將其放行。其中山賊相當於攔截器,鏢局相當於一個正在執行任務的網路請求,請求中的引數就是鏢局攜帶的元寶。攔截器可以將網路
OkHttp攔截器原理
學習自https://www.cnblogs.com/LuLei1990/p/5534791.html所以request就是攔截到的請求response就是攔截到的回覆這裡留下一個疑問,這個方法回撥的時間點是哪裡?顯然request和response不在一個時間上addNet
springmvc 攔截器修改ajax請求response的header值
由於ajax返回的json字串,而攔截器如果修改返回值將影響專案的大部分功能,所以只能用response的header進行少量的值得新增。例如 csrf的新增。但是在postHandle 方法中response已經被鎖定,無法進header的值得新增,所以只能在preHand
Retrofit,OkHttp攔截器,RxJava封裝請求網路
Retrofit和Okhttp和RxJava的封裝 匯入依賴 compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.7' co
OKHTTP攔截器的簡單使用
0: 工作中遇到使用攔截器的問題,寫這篇文章以作記錄。 1: OkHttp 內部是使用攔截器來完成請求和響應的,利用的是責任鏈設計模式,所以可以說,攔截器是 OkHttp 的精髓所在。 2: 假設現在後臺要求我們在請求 API 介面時,都在每一
android OkHttp攔截器(Interceptor)的使用
一 概念 在OkHttp內部是使用攔截器來完成請求和響應,利用的是責任鏈設計模式,可以用來轉換,重試,重寫請求的機制。現在主流的網路框架非Retrofit莫屬,它的內部請求也是基於OkHttp的。在每一個攔截器中,一個關鍵部分就是使用chain.proceed(requ
Okhttp攔截器實現軟負載
開發十年,就只剩下這套架構體系了! >>>