미세먼지앱
구글맵 api에 이어 공공기관 api 가져오기
- 데이터는 공공데이터포털(https://www.data.go.kr)을 이용함
- 수신된 JSON 데이터를 가공
- gradle에 라이브러리 추가
- http 통신을 위해 manifest에 인터넷 사용권한 추가
Retrofit
- 안드로이드 및 자바를 위한 타입 세이프한 HTTP 클라이언트 라이브러리
- Rest api의 HTTP요청ㅇ르 자바 인터페이스로 변환하는 것을 주 목적으로 함
- gradle에 라이브러리 추가
- api를 인터페이스로 정의
- retrofit 인스턴스 생성
gradle에
// build.gradle (Module: app)
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.x.x'
implementation 'com.squareup.retrofit2:converter-gson:2.x.x' // Gson 컨버터 추가
}
버전은 또 저번처럼 찾아봐야 할 거 같다. 우선 미세먼지앱을 만들 때 사용한 버전은
dependencies {
implementation("com.google.code.gson:gson:2.10.1")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.squareup.okhttp3:okhttp:4.10.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
implementation("com.github.skydoves:powerspinner:1.2.6")
}
위 라이브러리들이 추가 되었고, 스피너를 안드로이드 스튜디오에서 기본으로 제공하는게 아닌 좀 더 좋아 보이는 spinner를 사용 하기 위해 github에 검색해서 공개로 풀어놓은 걸 가져오는 라이브러리를 맨 마지막에 추가했다.
interface ApiService {
@GET("users/{id}")
fun getUser(@Path("id") id: Int): Call<User>
}
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService = retrofit.create(ApiService::class.java)
인터페이스로 예를 들어 User라는 클래스를 서버 응답으로 가져온다는 걸 정의하고, 밑에 인스턴스를 생성하면 이제 apiService 객체를 통해 정의된 API 요청을 사용할 수 있다...
일단 그렇다고 넘어가고 Rest api에 대해 알아보자.
Rest Api
클라이언트(소비자)가 Http라는 프로토콜(쌍방향 통신을 위한 서로간 약속 된 통신규약)을 URL로 넘겨서 서버에 요청하면 서버가 JSON으로 된 경량의 DATA를 보내준다. 이를 간결하고 효율적으로 사용하기 위해 구글에서 제공하는 오픈소스 라이브러리인 Gson을 사용한다.
Json과 Gson 사용 해보기
[Android] Gson이란? Gson 사용법 (tistory.com)
여기를 참고하여 사용해 보았다.
우선 Dto를 만들었다.
class Person {
@SerializedName("name")
@Expose
private val personName: String? = null
@SerializedName("age")
@Expose
private val age = 0
@SerializedName("height")
@Expose
private val height = 0.0
@SerializedName("marriage")
@Expose
private val marriage = false
fun getName(): String? {
return personName
}
fun getAge(): Int {
return age
}
fun getHeight(): Double {
return height
}
fun isMarriage(): Boolean {
return marriage
}
}
그리고 나서 이제 실행을 시킬 메인 파일에 작성을 시작해보았다.
class MainActivity {
var json: String? = null
var gson: Gson? = null
@Before
fun setBefore() {
json = "{\n" +
"\"name\":\"홍길동\",\n" +
"\"age\":14,\n" +
"\"height\":182.4,\n" +
"\"marriage\":false\n" +
"}"
gson = Gson()
}
@Test
fun gsonTest() {
val person = gson?.fromJson(json, Person::class.java)
println("이름 : " + person?.getName())
println("나이 : " + person?.getAge())
println("키 : " + person?.getHeight())
println("결혼 여부 : " + person?.isMarriage())
}
}
setBefore로 우선 json을 만들어준다.
이후 밑에 테스트 해볼 gson에 대입해준다. fromJson이라는 함수 안에 매개변수로 위에서 만든 json을 넣어주고 Person이라는 위에 만든 클래스도 넣어준다.
이러면 이렇게
이름 : 홍길동
나이 : 14
키 : 182.4
결혼 여부 : false
로 값이 그대로 나온다....음 그래도 아직 잘 이해는 못 한 거 같다. 갈 일이 멀었다...
'내일배움캠프' 카테고리의 다른 글
본 캠프 48일 차 - api를 통해 가져온 데이터 출력하기 (1) | 2024.01.26 |
---|---|
본 캠프 47일 차 (0) | 2024.01.26 |
본 캠프 45일 차 (0) | 2024.01.23 |
본 캠프 44일 차 (2) | 2024.01.22 |
본 캠프 42일 차 (0) | 2024.01.18 |