【问题标题】:How i change the retrofit URL at runtime我如何在运行时更改改造 URL
【发布时间】:2019-03-26 19:24:05
【问题描述】:

我需要在改造中更改 URL 库,我正在使用 koin 在应用启动时创建改造模块,我想在运行时更改此 url。

我已经尝试将 baseUrl("http://192.168.192.168/") 更改为 baseUrl("http://") 并在改造调用时更改 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, ...)
)

谁能帮我解决这个问题?

【问题讨论】:

标签: android kotlin retrofit2 koin


【解决方案1】:

您必须在代码中添加这些行:

第一步: 在构建 Retrofit 实例时添加新的 CallAdapter RxJavaCallAdapterFactory.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);
}

最后一步: 在发出请求时,我们的匿名订阅者会响应 observable 发出事件的流。

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());
                }
            });
}

这是您构建动态网址的方式:想了解更多详细信息完整说明链接:Sending Data With Retrofit 2 HTTP Client for Android

请参阅base URL,详细了解如何根据基本 URL 解析该值以创建完整的端点 URL。

如果您正在使用 kotlin:请点击此链接。 dynamic urls at Runtime with Retrofit 2

【讨论】:

    【解决方案2】:

    我已经尝试将 baseUrl("http://192.168.192.168/") 更改为 baseUrl("http://") 并在改造调用时更改 url,但我的应用程序崩溃并返回非法 URL 错误。

    您可以将其保留为baseUrl,如果您使用@URL,它将覆盖您的Retrofit.Builder()

    您可以使用@URL 参数动态更改端点。

    @GET
    fun getUsers(@Url String url) : Observable<UserResponse>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2020-06-26
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多