# Retrofit2 串接API [台南市資料開放平台]
## 下面程式碼示範用retrofit取得台南市及時停車場相關資訊
#### 事前準備工作
```kotlin=
//於專案build.gradle:app 新增下面三行
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
implementation'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
```
```kotlin=
//於專案資料夾manifests內的AndroidManifest.xml新增下面這行啟用網路功能
<uses-permission android:name="android.permission.INTERNET" />
```
##### 安裝套件
安裝 JSON To Kotlin Class
他可以迅速幫助你轉換JSON格式成data class

#### [這是台南市開放資料平台的連結](https://opengov.tainan.gov.tw/OpenApi/api/doc/v3)
##### 我們使用 "臺南市停車場即時剩餘車位資訊"
這是及時車位Get到的資料一部分

#### 建立資料類別 [*ApiDataClass.kt*]
新增一個.kt檔 ,開啟檔案, 按ALT+ K, 開啟JSON To Kotlin Class, 將剛剛Get到的JSON貼上去, class name,自行命名

#### 自動產出資料類別
```kotlin=
data class GetData(
val contentType: String,
val `data`: List<ApiData>,
val id: String,
val isImage: Boolean,
val success: Boolean
)
data class ApiData(
val address: String?,
val car: Int,
val carDis: Int,
val carDis_total: Int,
val carGreen: Int,
val carGreen_total: Int,
val carWoman: Int,
val carWoman_total: Int,
val car_total: Int,
val chargeFee: String?,
val chargeTime: String?,
val code: String?,
val id: String?,
val largeCar: Int,
val largeCar_total: Int,
val lnglat: String?,
val moto: Int,
val motoDis: Int,
val motoDis_total: Int,
val moto_total: Int,
val name: String?,
val typeId: String?,
val typeName: String?,
val update_time: String?,
val zone: String?,
val zoneId: String?
)
```
#### 建立Interface [*ApiInterFace.kt*]
```kotlin
interface ApiInterface {
@GET("api/service/Get/c3604e1d-c4e1-4224-9d41-084ce299c3bf")
fun login (): Call<GetData>
}
```
#### 上面的Call>GetData> 對應到data class
#### *MainActivity.kt*
```kotlin=
class MainActivity : AppCompatActivity() {
private val baseUrl = "https://opengov.tainan.gov.tw:443/OpenApi/"
private val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
private val api = retrofit.create(ApiInterface::class.java)
lateinit var send:Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.btn_info).setOnClickListener() {
api.login().enqueue(object : Callback<GetData> {
override fun onFailure(call: Call<GetData>, t: Throwable) {
Log.d("Error","連線失敗")
}
override fun onResponse(call: Call<GetData>, response: Response<GetData>) {
val lis = response.body()!!.data
runOnUiThread {
for(i in lis.indices) {
var address = lis[i].address
var name = lis[i].name
//Log.d("size", "size = ${lis.size}")
findViewById<TextView>(R.id.tv_show).text = "address = $address , name = $name!"
}
}
}
})
}
}
}
```
##### 觀察Get的JSON資料
**我們所需要的資訊都在 data:裡面**

##### 所以透過程式碼第20行取得回傳資料的data 這個List就可以處理想要的資料了
###### tags: `kotlin` `Android` `retrofit`