Giter Site home page Giter Site logo

jessyancoding / retrofiturlmanager Goto Github PK

View Code? Open in Web Editor NEW
2.2K 46.0 307.0 15.78 MB

🔮 Let Retrofit support multiple baseUrl and can be change the baseUrl at runtime (以最简洁的 Api 让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl).

License: Apache License 2.0

Java 100.00%
retrofit2 baseurl baseurl-domain mvparms arms retrofit okhttp okhttp3

retrofiturlmanager's Introduction

RetrofitUrlManager

Jcenter Build Status Android Arsenal API License Author QQ-Group

Let Retrofit support multiple baseUrl and can be change the baseUrl at runtime.

中文说明

Overview

overview

Notice

Framework analysis 1

Framework analysis 2

More complete sample

Download

 implementation 'me.jessyan:retrofit-url-manager:1.4.0'

Usage

Initialize

 // When building OkHttpClient, the OkHttpClient.Builder() is passed to the with() method to initialize the configuration
 OkHttpClient = RetrofitUrlManager.getInstance().with(new OkHttpClient.Builder())
                .build();

Step 1

 public interface ApiService {
     @Headers({"Domain-Name: douban"}) // Add the Domain-Name header
     @GET("/v2/book/{id}")
     Observable<ResponseBody> getBook(@Path("id") int id);
}

Step 2

 // You can change BaseUrl at any time while App is running (The interface that declared the Domain-Name header)
 RetrofitUrlManager.getInstance().putDomain("douban", "https://api.douban.com");

If you want to change the global BaseUrl:

 // BaseUrl configured in the Domain-Name header will override BaseUrl in the global setting
 RetrofitUrlManager.getInstance().setGlobalDomain("your BaseUrl");

About Me

License

 Copyright 2017, jessyan

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

retrofiturlmanager's People

Contributors

clzd0792 avatar jessyancoding avatar leoyu007 avatar sum41forever avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

retrofiturlmanager's Issues

不知怎么回事就报错了

如下错误:
Missing either @get URL or @url parameter.

代码是;
@headers({DOMAIN_NAME_HEADER + Api.FILM_NAME})
@get("")
Observable indexPhp();

private NetWorkManager() {
this.mOkHttpClient = RetrofitUrlManager.getInstance().with(new OkHttpClient.Builder()) //RetrofitUrlManager 初始化
.readTimeout(5, TimeUnit.SECONDS)
.connectTimeout(5, TimeUnit.SECONDS)
.build();

    this.mRetrofit = new Retrofit.Builder()
            .baseUrl(Api.FILM_HOST)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用rxjava
            .addConverterFactory(ScalarsConverterFactory.create())//使用Gson
            .client(mOkHttpClient)
            .build();

    this.noLimit91PornService = mRetrofit.create(NoLimit91PornService.class);
    this.film6080Service = mRetrofit.create(Film6080Service.class);
}

url有的啊,没参数不需要传的

能否做到静态触发和静态配置

我从网上找了,每一个在拦截器的下面都有你的评论,但是我使用了拦截器的方式导致了okhttp内部异常了。我就是想使用静态的方式多个url访问不同的接口这种情况,我在您代码中貌似没有看到,如果每次都按照你说的在调用接口的地方put,这和@url没啥区别了,所有想问下静态怎么玩的

不同服务器Token问题

大神,我本来加了个拦截器,用于token获取的,但是配上多baseUrl后,就需要区分是哪个domainName返回不同是token。但是domainName被你remove掉了,可有办法解决?(通过监听器监听urlChanged应该会有线程安全问题)

请教一下RetrofitUrlManager这个类里的方法

你好,很高兴能使用这个好用的开源库,我在阅读代码的时候,在manager类里有几个疑问,
1.manager的registerUrlChangeListener和unregisterUrlChangeListener方法是什么时候调用的,又是谁去调用的?

2.在processRequest方法内,

        if (!TextUtils.isEmpty(domainName)) {
            notifyListener(request, domainName, listeners);//内部调用onUrlChangeListener的onUrlChangeBefore方法
            httpUrl = fetchDomain(domainName);
            newBuilder.removeHeader(DOMAIN_NAME);//为什么要删除这个header呢?

想问一下,为什么要调用listeners的onUrlChangeBefore方法呢?之后又为什么删除这个header呢?这样做的好处是什么呀?

非常期待你的回答,谢谢

大神, 真心不知道该怎么用, 使用方式写的不清楚! 望尽快回复,谢谢!

普通模式
高级模式
超级模式
这三种模式的使用方式写的不够清楚
难道每个uir还需要单独定义一个ApiService 接口吗?
可以在 App 运行时随意切换某个接口的 BaseUrl?
本人项目中使用了dagger2
mPresenter.getBanner(1); (原baseurl)
RetrofitUrlManager.getInstance().putDomain("bo", Constant.BASE_URL_BO);
mPresenter.getAccountBalance(1);(新的baseurl: Constant.BASE_URL_BO)
请问这样使用是否正确?
还有如果是, 多headers 是否有影响?
/**
* 获取首页banner列表
*
* @param type
* @return
*/
@headers({
"Domain-Name: bo",
"Content-Type: application/json"})
@get(Constant.GET_ACCOUNT_BANNERS)
Observable getAccountBalance(@query("type") int type);

oldBaseUrl: BASE_URL = "http://192.168.1.85:8088/api/user/v1/
替换
newBaseUrl: BASE_URL_BO = "http://192.168.1.85:8020/"

URLDecoder Error

请求带有%符号的时候 请求就报错了...log 显示这个玩意儿

java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern : %)3
at com.jess.arms.http.log.RequestInterceptor.parseParams(RequestInterceptor.java:211)
at com.jess.arms.http.log.RequestInterceptor.intercept(RequestInterceptor.java:86)

CharacterHandler.jsonFormat(URLDecoder.decode(requestbuffer.readString(charset), convertCharset(charset)));指向了这个方法
inter

不同url 的https证书问题

感谢开源;现在遇到一个问题,url切换成功了,但是每个url有不同的https证书,请问这个应该怎么切换。

maven location

大佬的库非常好用,希望能提供maven支持。maven官方库没有找到该坐标

me.jessyan retrofit-url-manager 1.4.0

retrofitmanager 与glide冲突

用retrofitmanager动态改变了baseurl,会使glide加载的网络图片url全部替换成baseurl,导致图片404

多个请求同时发出出现的问题

当一个界面出现多个请求一起请求时,不同的url前缀,进行切换后(我用的是全局BaseUrl),偶尔会出现url错位,我是进行不同的url请求时先全局切换baseUrl的,同时请求可能第一个还没有开始请求但是已经切换全局url了,然后第二个也开始操作,直接切换替换第一个请求的baseUrl, 所以第一个url就不对了,路径就是错误的报404了,第二个却是对的。可以帮忙看看这个问题怎么解决么?谢谢

使用@Url注解的接口,传入的url会被globalDomain覆盖

通过RetrofitUrlManager.getInstance().setGlobalDomain方法设置了baseUrl。

现在我有个接口想要用一个单独的host来访问,接口定义如下:
@get
fun ping(@url url: String): Call

请求的时候,此方法中传入的我想要的url会被之前设置的baseUrl覆盖。
望修复。

错误

机型:华为H60-L01 系统:Android4.4.2
java.lang.ExceptionInInitializerError
at me.jessyan.retrofiturlmanager.RetrofitUrlManager.getInstance(RetrofitUrlManager.java:91)
at come.sina.show.net.NetClient.(NetClient.java:65)
at come.sina.show.net.NetClient.(NetClient.java:22)
at come.sina.show.net.NetClient$SingletonHolder.(NetClient.java:77)
at come.sina.show.net.NetClient.getInstance(NetClient.java:85)
at come.sina.show.f.r.(MainPresenter.java:33)
at come.sina.show.activity.MainActivity.r(MainActivity.java:92)
at come.sina.show.activity.BaseActivity.onCreate(BaseActivity.java:59)
at android.app.Activity.performCreate(Activity.java:5285)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2345)
at android.app.ActivityThread.access$1100(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5314)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Must be dependency Okhttp
at me.jessyan.retrofiturlmanager.RetrofitUrlManager.(RetrofitUrlManager.java:73)
at me.jessyan.retrofiturlmanager.RetrofitUrlManager.(RetrofitUrlManager.java:46)
at me.jessyan.retrofiturlmanager.RetrofitUrlManager$RetrofitUrlManagerHolder.(RetrofitUrlManager.java:87)
... 22 more
java.lang.IllegalStateException: Must be dependency Okhttp
at me.jessyan.retrofiturlmanager.RetrofitUrlManager.(RetrofitUrlManager.java:73)
at me.jessyan.retrofiturlmanager.RetrofitUrlManager.(RetrofitUrlManager.java:46)
at me.jessyan.retrofiturlmanager.RetrofitUrlManager$RetrofitUrlManagerHolder.(RetrofitUrlManager.java:87)
at me.jessyan.retrofiturlmanager.RetrofitUrlManager.getInstance(RetrofitUrlManager.java:91)
at come.sina.show.net.NetClient.(NetClient.java:65)
at come.sina.show.net.NetClient.(NetClient.java:22)
at come.sina.show.net.NetClient$SingletonHolder.(NetClient.java:77)
at come.sina.show.net.NetClient.getInstance(NetClient.java:85)
at come.sina.show.f.r.(MainPresenter.java:33)
at come.sina.show.activity.MainActivity.r(MainActivity.java:92)
at come.sina.show.activity.BaseActivity.onCreate(BaseActivity.java:59)
at android.app.Activity.performCreate(Activity.java:5285)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2345)
at android.app.ActivityThread.access$1100(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5314)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
at dalvik.system.NativeStart.main(Native Method)

全局改变BaseUrl不生效了?

大神你好!刚试了下全局改变baseurl,好像不生效啊。另外demo里没有全局改变baseurl的demo了呀。跑出来的demo与demo预览图不一样,我是在登录界面设置按钮切换全部BaseUrl。

image

image

image

不用map去存放要改变的DomainKey和Domain,直接在Headers里面放域名,然后读Headers的时候取出来替换是不也可以?

public interface ApiService {
     @Headers({"Domain-Name: douban"}) // Add the Domain-Name header
     @GET("/v2/book/{id}")
     Observable<ResponseBody> getBook(@Path("id") int id);
}

改为:

public interface ApiService {
     @Headers({"Domain-Name: https://www.douban.com"}) // Add the Domain-Name header
     @GET("/v2/book/{id}")
     Observable<ResponseBody> getBook(@Path("id") int id);
}

然后具体地址作为静态常量来复用是不也可以呢?当然本质是一样的。

我有一个另外的实现方案,几乎不会增加什么理解成本,欢迎各位尝试并交流 https://github.com/uni-cstar/oknet

GitHub:https://github.com/uni-cstar/oknet
This may be currently (2023/03) Retrofit (OkHttp) supports multiple BaseUrl and changes BaseUrl at runtime to achieve the simplest library;
At the same time, it may also be the simplest and most comprehensive library that supports global Header configuration implementation;
It does not conflict with Retrofit's @url method, that is, if @url specifies another baseurl, which has nothing to do with the globally configured domain name, then the globally configured baseurl and header will not have any impact on the interface.
这也许是目前(2023/03)Retrofit(OkHttp)支持多BaseUrl以及在运行时改变BaseUrl实现最简单的库;
同时也许也是支持全局Header配置实现最为简单、最为全面的库;
与Retrofit的@url方法不冲突,即如果@url指定的是其他baseurl,与全局配置的域名毫无关系,那么全局配置的baseurl和header不会对接口造成任何影响。

no-op implementation support

In my current case, the retrofit url manager only needed to switch base url at development phase, so the releaseImplementation not needed

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.