Life is a fucking movie. 😈 😈 😈 😈 😈 😈
人生如戏。
🔮 Let Retrofit support multiple baseUrl and can be change the baseUrl at runtime (以最简洁的 Api 让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl).
License: Apache License 2.0
In my current case, the retrofit url manager only needed to switch base url at development phase, so the releaseImplementation
not needed
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);
}
然后具体地址作为静态常量来复用是不也可以呢?当然本质是一样的。
用之前创建的Retrofit实例调用newBuilder()应该可以改变动态变url把
换到jitpack或其他?
如题,现在项目比较到,给每个方法加domain header还是比较麻烦的
。。。
大佬的库非常好用,希望能提供maven支持。maven官方库没有找到该坐标
me.jessyan retrofit-url-manager 1.4.0How to use for the Post method
感谢开源;现在遇到一个问题,url切换成功了,但是每个url有不同的https证书,请问这个应该怎么切换。
大神,我本来加了个拦截器,用于token获取的,但是配上多baseUrl后,就需要区分是哪个domainName返回不同是token。但是domainName被你remove掉了,可有办法解决?(通过监听器监听urlChanged应该会有线程安全问题)
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不会对接口造成任何影响。
setGlobalDomain http://192.168.12.5:8055/CityInterface/
getGlobalDomain http://192.168.12.5:8055/CityInterface/
经过 HttpUrl newUrl = mUrlParser.parseUrl(httpUrl, request.url()); 处理后 多了个CityInterface
httpurl http://192.168.12.5:8055/CityInterface/
newurl http://192.168.12.5:8055/CityInterface/CityInterface/
@url可以替换baseurl
用retrofitmanager动态改变了baseurl,会使glide加载的网络图片url全部替换成baseurl,导致图片404
如题,baseurl中我带有/,后来切换之后请求的参数就是主域名少了一部分,不知道是为什么.
你好,很高兴能使用这个好用的开源库,我在阅读代码的时候,在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呢?这样做的好处是什么呀?
非常期待你的回答,谢谢
如题,要怎么搭配使用
http://www.baidu.com:8080 目前只能是这种格式的BaseUrl验证,在DefaultUrlParser类中添加
return url.newBuilder() .scheme(domainUrl.scheme()) .host(domainUrl.host()) .port(domainUrl.port()) .encodedPath(domainUrl.encodedPath() + url.encodedPath()) // url的第三个 / 以后的 path路径 .build();
http://www.baidu.com:8080 /youpath/随意 的支持!Thanks,亲测可用~
我们的URL以前是 http://test.xxx.cn/ 然后后面拼接业务具体的
我是用的你的模块化 新的项目 变成了 http://test.xxx.cn/test/ 然后后面拼接业务
然后就导致了链接变成了 http://test.xxx.cn/test/ test/ 加业务
我在文档里面看到了 public static final String IDENTIFICATION_IGNORE = "#url_ignore";
我就添加了 http://test.xxx.cn/test/#url_ignore 依然没用.
我先试试高级模式
如下错误:
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没啥区别了,所有想问下静态怎么玩的
当一个界面出现多个请求一起请求时,不同的url前缀,进行切换后(我用的是全局BaseUrl),偶尔会出现url错位,我是进行不同的url请求时先全局切换baseUrl的,同时请求可能第一个还没有开始请求但是已经切换全局url了,然后第二个也开始操作,直接切换替换第一个请求的baseUrl, 所以第一个url就不对了,路径就是错误的报404了,第二个却是对的。可以帮忙看看这个问题怎么解决么?谢谢
RetrofitUrlManager.getInstance().putDomain("douban", "https://api.douban.com")
@headers({"Domain-Name: douban"}) // 加上 Domain-Name header
@get("/v2/book/{id}")
Call getBook(@path("id") int id);
请求带有%符号的时候 请求就报错了...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)));
指向了这个方法
因为涉及baseurl不同,不同url的https证书也会不同 有啥好办法没有解决这个问题没有呢?
普通模式
高级模式
超级模式
这三种模式的使用方式写的不够清楚
难道每个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/"
RT
baseUrl 为 https://xxx.yyy.cn/app/api/ ( 初始 retrofit实例设置的 baseUrl )
domainUrl 为 http://aaa-bbb.yyy.cn/api/ (putDomain 设置的 domainUrl )
在 @headers 中引用 domainUrl, 且设置 @get("teacher/classOption")
异常结果却为 http://aaa-bbb.cn/api/app/api/teacher/classOption ,
预期应该为 http://aaa-bbb.yyy.cn/api/teacher/classOption
在多线程中 mDomainNameHub 是安全的吗?在多线程请求密集时会不会有ConcurrentModificationException错误?
机型:华为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)
每个模块的接口用的时候addInterceptor,最后就是唯一的OkHttpClient实例拥有所有的interceptor,对每一个request都会带上所有的interceptor来处理?
也许和这个lib无关,但是从“只有一个retrofit实例”这个话题想起的
这种方式,我之前在项目中实践过。
使用过程中,遇到这样的问题:
在访问Https时,在某些手机上,会出现异常:
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found
。
请问你有没有遇到过这样的问题,对于此种问题,有没有什么更好的办法?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.