1. 程式人生 > >okhttp攔截器的使用------修改baseurl

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攔截實現軟負載

開發十年,就只剩下這套架構體系了! >>>