Home > Software engineering >  baseurl must end in /
baseurl must end in /

Time:01-30

I have weather api to parse data for 10 days

All it's good , but I have problem with retrofit now , I have app crashes , my URL(with API) have / in the end.

But still don't working.

Also I have dependency injection for retrofit.

Goal is to get data from api.

Hope , that you will help me to resolve this problem.


package const

const val BASE_URL = "https://api.weatherapi.com/v1/forecast"  
        ".json?key=a9f9d57b6e064f16b28141346231001&q=London&days=10&aqi=no&alerts=no/" // error here
const val apikey = "a9f9d57b6e064f16b28141346231001"
const val WeatherDays  = 10

interface WeatherServiceAPI {

    @GET("forecast.json")
    suspend fun Weatherday(
        @Query("days") days : Int
    ) : WeatherResponse

    @GET("forecast.json")
    suspend fun searchcitybycoord(@Query("lat")lat:String) : List<WeatherLocationDTO>

    @GET("forecast.json")
    suspend fun searchingbyCity(@Query("q") name: String) : List<WeatherLocationDTO>

companion object{
    operator fun invoke(
        connectivityInterceptor: Interceptor
    ):WeatherServiceAPI{
        val requestInterceptor  = Interceptor{
            chain ->  val url = chain.request()
            .url
            .newBuilder()
            .addQueryParameter("key", apikey)
            .build()
            val request = chain.request()
                .newBuilder()
                .url(url)
                .build()
            return@Interceptor chain.proceed(request)
        }
        val okHttpClient = OkHttpClient.Builder()
            .addInterceptor(requestInterceptor)
            .addInterceptor(connectivityInterceptor)
            .build()

        return  Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl("https://api.weatherapi.com/v1/") // error line
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(WeatherServiceAPI::class.java)
    }
}
}

@Provides
@Singleton
fun providerepository(api:WeatherServiceAPI):ForecastRepository{
    return ForecastRepositoryImpl(api)
}
    @Provides
    @Singleton
    fun provideWeatherApiService(retrofit: Retrofit) =
        retrofit.create(WeatherServiceAPI::class.java)

    @Provides
    @Singleton
    fun provideRetrofit ( okHttpClient: OkHttpClient)  = Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl(BASE_URL)
        .client(okHttpClient)
        .build()

    @Provides
    @Singleton
    fun provideOkhttpClient(interceptor: Interceptor): OkHttpClient {
        val httpBuilder = OkHttpClient.Builder().addInterceptor(interceptor)
        return  httpBuilder.build()
    }
    @Provides
    @Singleton
    fun provideinterceptor():Interceptor{
        return Interceptor {
            val request =it.request().newBuilder()
            val actualRequest = request.build()
            it.proceed(actualRequest)
        }
    }

CodePudding user response:

Given what else you have in the code, your base URL should be https://api.weatherapi.com/v1/.

forecast.json comes from the @GET annotations, and the query parameters will need to come from @Query-annotated parameters to your Retrofit interface functions.

  • Related