如何在运行时更改Retrofit的URL

4
我需要更改Retrofit中的URL基础,我正在使用Koin在应用程序启动时创建一个Retrofit模块,并且我想在运行时更改此URL。
我已经尝试将baseUrl("http://192.168.192.168/")更改为baseUrl("http://")并更改Retrofit调用中的URL,但我的应用程序崩溃并返回非法URL错误。
这是我创建构建器的方法。
fun createRetrofit(okHttpClient: OkHttpClient): Retrofit {
    return  Retrofit.Builder()
    .baseUrl("http://192.168.192.168/")//i need change this at runtime
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}

创建一个 Bean 到我的模块。
val retrofitModule: Module = applicationContext {
    bean { createRetrofit(get()) }
}

并启动koin:

startKoin(application = this,
  modules = listOf(retrofitModule, ...)
)

有人能帮我解决这个问题吗?


https://dev59.com/zlwY5IYBdhLWcg3wgH3y - samaromku
2个回答

1
我已经尝试将baseUrl("http://192.168.192.168/")更改为baseUrl("http://"),并更改retrofit调用中的url,但我的应用程序崩溃并返回非法URL错误。如果您使用@URL,则可以将其保留为baseUrl,它将覆盖您的Retrofit.Builder()中的baseUrl。您可以使用@URL参数动态更改端点。
@GET
fun getUsers(@Url String url) : Observable<UserResponse>

1

您必须在代码中添加以下行:

第一步: 在构建Retrofit实例时添加新的CallAdapterRxJavaCallAdapterFactory.create()

public static final String BASE_URL = "http://google.com/";
public static Retrofit getClient(String baseUrl) {
    if (retrofit==null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}

下一步: 更新APIService示例:->将savePost(String title, String body, String userId)方法更改为Observable。
public interface APIService {
    @GET
    Call<ResponseBody> list(@Url String url);
//or

@POST("/posts")
@FormUrlEncoded
Observable<Post> savePost(@Field("title") String title,
                          @Field("body") String body,
                          @Field("userId") long userId);
}

最后一步: 在进行请求时,我们的匿名订阅者会响应可观察流所发出的事件。

public void sendPost(String title, String body) {

    // RxJava
    mAPIService.savePost(title, body, 1).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<Post>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Post post) {
                    showResponse(post.toString());
                }
            });
}

这是动态URL的构建方式:想要了解更多详细信息,请点击完整描述链接:使用Retrofit 2 HTTP客户端在Android上发送数据
另外,请查看基本URL,以了解如何将该值与基本URL解析,以创建完整的终端点URL。
如果您正在使用Kotlin,请参考此链接。使用Retrofit 2在运行时生成动态URL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接