【问题标题】:Retrofit Dynamic URL still appends to the Base URL改造动态 URL 仍附加到基本 URL
【发布时间】:2018-06-20 09:46:04
【问题描述】:

这是我的改造界面和创建代码:

interface SSApi {
companion object {
    private fun create(): SSApi {
        val httpClient = OkHttpClient().newBuilder()
        val networkInterceptor = Interceptor { chain ->
            val request = chain.request()?.newBuilder()?.addHeader("api-key", SSConstants.API_KEY)?.build()
            chain.proceed(request!!)
        }

        val loggingInterceptor = HttpLoggingInterceptor()
        loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY

        httpClient.addNetworkInterceptor(networkInterceptor).addInterceptor(loggingInterceptor)

        val retrofit = Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(SSConstants.BASE_URL)
                .client(httpClient.build())
                .build()

        return retrofit.create(SSApi::class.java)
    }

    val api by lazy {
        SSApi.create()
    }

    var disposable: Disposable? = null
}

@GET
fun getWeatherInfo(@Url url: String): Observable<OpenWeatherMapInfo>
}

这是我如何使用disposable

    private fun getWeather() {
    disposable = api
            .getWeatherInfo(SSConstants.OPEN_WEATHER_MAP_API_ENDPOINT)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    { results -> Log.i("Dale", results.toString())},
                    { error -> Log.i("Dale", error.message)}
            )
    }

当我执行请求时,我可以看到我的OPEN_WEATHER_MAP_API_ENDPOINT 仍然附加到我的baseUrl

这是我的常量类供参考:

object SSConstants {
const val OPEN_WEATHER_MAP_API_ENDPOINT = "api.openweathermap.org/data/2.5/weather?q=Catbalogan,PH&units=metric"
const val BASE_URL = "https://api.xxx.xxx/"
}

【问题讨论】:

  • 您的OPEN_WEATHER_MAP_API_ENDPOINT 值是什么样的?
  • @zsmb13 添加了我的常量类以供参考

标签: android kotlin retrofit2 rx-android rx-kotlin


【解决方案1】:

您的问题是您没有在动态调用中提供完整的 URL,这就是 Retrofit 尝试仍然相对于基本 URL 进行调用的原因。只需将https:// 添加到动态网址即可:

const val OPEN_WEATHER_MAP_API_ENDPOINT = "https://api.openweathermap.org/data/2.5/weather?q=Catbalogan,PH&units=metric"

Here是一篇讨论动态URL在不同场景下如何解析的文章,供大家参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多