Kotlin Practice # 15 Compose Retrofit 多參數URL串接

Dogpa Chen
Apr 19, 2023

--

上一篇理解到如何透過簡單的做法跳轉到其他APP,side project也多完成了一個小功能。

這篇則要回頭再看看一次網路串接API取得資料的Retrofit。

原本上一篇練習的的API URL是沒有含任何參數的,但在自己的side project是需要串接中央氣象局的API,而中央氣象局會需要帶入相對應的資訊才能夠建立完整的呼叫API的URL。

先看看本來要呼叫API的中央氣象局URL

https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-D0047-011?Authorization=中央氣象局申請的授權碼&format=JSON&locationName=五峰鄉&elementName=T,WeatherDescription

F-D0047–011為中央氣象局的新竹縣對應碼,預計取得未來七天的預報

問號後面則是API的參數

Authorization是申請會員後取得的授權碼

format是回傳資料格式

locationName是欲查詢的鄉鎮市名稱

elementName是回傳的資料,T為溫度WeatherDescription為天氣描述

本來按照網路搜尋的結果都將參數改成Query但仍然報錯,錯誤碼如下

retrofit must not have replace block. for dynamic query parameters use @query

但我一直不解的是我已經將所有的@Path改為@Query但為什麼仍然無法執行,後來發現原因,只需在URL?後面的改為@Query,前面的部分仍然用@Path,?問號前仍然為API的URL,後面是該API帶的參數。

interface ApiService {

@GET("v1/rest/datastore/{countryNo}")
suspend fun getWeatherForecastList(

@Path("countryNo") countryNo: String,
@Query("authorization") authorization: String = "申請到的驗證碼",
@Query("format") format: String = "JSON",
@Query(value = "locationName", encoded = true) locationName: String,
@Query(value = "elementName", encoded = true) elementName: String = "T,WeatherDescription",
): CWBModel


//建立實例
companion object {
var apiService: ApiService? = null
fun getInstance() : ApiService {
if (apiService == null) {
apiService = Retrofit.Builder()
.baseUrl("https://opendata.cwb.gov.tw/api/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build().create(ApiService::class.java)
}
return apiService!!
}
}
}

以上是對應API URL的改動方式,對於Retrofit的運用又多了一個學習,持續加油!!

--

--