JSON 형식
- [ ] -> list
- { } -> 객체
[ { "id" : 1 "name" : "choco" }, { "id" : 2 "name" : "banana" } ]
JSON을 kotlin이나 Java가 이해할 수 있게 변환/해석하는 과정
manifest 파일에 다음 코드 추가
<uses-permission android:name="android.permission.INTERNET" />
Http url 접근 허용하기
안드로이드에서 API28 이후로 기본적으로 Http 접근을 허용하지 않기 때문에, 불가피하게 Http 접근을 해야한다면 manifest 파일의 application 태그에
android:usesCleartextTraffic="true"
속성을 추가해주어야 한다.
// 어디로 요청할 건지 url 설정하기
val urlString: String = "http://mellowcode.org/json/students/" // 강사님이 만들어 놓으신 실습 url
// String 형식의 url로 URL 객체 생성하기
val url: URL = URL(urlString)
// url객체로 connection 설정
val connection: HttpURLConnection = url.openConnection() as HttpURLConnection
URLConnection
- 사용자 인증, 보안이 설정되어있지 않은 웹서버에 접속하여 파일 등을 다운하는 데에 주로 사용된다.
- 리소스에 연결하기 전에 구성된다.
- URLConnection 인스턴스는 재사용이 안된다.
HttpURLConnection
- 웹을 통해 데이터 통신할 때 사용한다.
- 데이터 타입, 길이는 거의 제한이 없다.
- 스트리밍 데이터를 주고받는데 사용된다.
- HttpURL을 처리하는 추가적인 메소드를 가진다.
- 개발자가 직접 HttpURLConnection 객체를 생성하지는 못하지만(생성자가 protected), openConnection()이 return하는 URLConnection 객체를 형변환해서 사용
자주 사용하는 Request Type
- GET : 정보 요청
- POST : 정보 추가 요청
- DELTE : 정보 삭제 요청
- PUT : 정보 수정 요청
connection.requestMethod = "GET" // GET 방식으로 통신하겠다.
// request의 헤더를 작성
connection.setRequestProperty("Content-Type", "application/json") // Key-Value 형식
- BufferedReader : 문자를 하나씩 읽어들이는 것이 아니라, 여러개를 한꺼번에 읽어들여서 읽기를 더 효율적으로 할 수 있도록 해준다.
- InputStreamReader(읽을 InputStream, 읽을 형식) : InputStream을 지정된 형식으로 받아올 수 있게 해준다.
var buffer = ""
// RequestCode가 200 OK라면, ("GET"이 성공했다면)
if (connection.responseCode == HttpURLConnection.HTTP_OK) {
val reader = BufferedReader(
InputStreamReader(
connection.inputStream,
"UTF-8"
)
)
buffer = reader.readLine()
}
-> 데이터 통신을 할 때 데이터들은 사람들이 이해할 수 없는 Byte 형식의 Stream으로 들어오는데, 그 Stream을 UTF-8 방식으로 읽게 되면 사람이 이해할 수 있는 형식으로 받을 수 있다.
implementation 'com.google.code.gson:gson:2.8.7'
// buffer에 있는 string을 json parsing해서 Person객체에 알맞게 데이터를 넣는다.
val data = Gson().fromJson(buffer, Array<Person>::class.java)
❗주의사항 Serializable한 class를 배열(Array)의 형태로 받아오는 걸 잊지 말자!! 왜냐하면 받아온 json에는 객체들이 리스트로 존재할 수 있기 때문!!