안드로이드에서 retrofit을 사용해서 Node.js와 통신을 해보자.
안드로이드에서 서버와 통신하는 방법은 retrofit과 volley를 사용하는 방법의 두 가지를 꼽을 수 있다.
기존의 httpconnection은 자유도는 높지만 직접 구현해야 하는 것들이 많아 난이도가 높다는 단점이 있다.
그에 비해 위의 둘은 구현하기가 매우 쉽기 때문에 사용하기 편리하다.
또한 둘 중에서는 retrofit이 속도 면에서 더 빠르다는 장점이 있다고 한다.
retrofit API문서는 위의 주소를 참고하자.
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.8.2'
가장 먼저, android studio의 gradle에 위와 같이 retrofit과 JSON파일을
GSON파일로 변환하기 위해서 converter를 함께 추가해주도록 하자.
그런 다음 mainactivity에 각각 명령을 호출할 버튼을 총 네 개 추가해주도록 한다.
우리가 Node.JS와 통신할 때 사용할 명령은 GET, POST, UPDATE, DELETE의 네 가지이다.
각각의 명령이 어떤 용도로 사용되는지는 REST API에 대해서 알아보도록 하자.
이 명령들이 정의된 API interface를 프로그램 어디서든 호출할 수 있도록 하나의 파일에 정의해 주도록 하자.
package com.myproject.exam2
import retrofit2.Call
import retrofit2.http.*
data class ResponseDC(var result:String? = null)
interface APIInterface {
@GET("/")
fun getRequest(@Query("name") name: String): Call<ResponseDC>
@FormUrlEncoded
@POST("/")
fun postRequest(@Field("id")id: String,
@Field("password")password: String):Call<ResponseDC>
@FormUrlEncoded
@PUT("/{id}")
fun putRequest(@Path("id")id: String,
@Field("content")content: String): Call<ResponseDC>
@DELETE("/{id}")
fun deleteRequest(@Path("id")id: String): Call<ResponseDC>
}
이 파일에 APIInterface를 생성하여 이곳에 네 가지 명령어들을 정의했다.
또한 서버로부터 response를 받을 데이터 클래스 ResponseDC를 정의했다.
POST와 PUT를 보면, 전송할 데이터에 Field가 있을 경우 @FormUrlEncoded를 추가해주어야 한다.
파일을 모두 작성했으면 MainActivity로 넘어가도록 하자.
val url = "서버 주소"
val retrofit = Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.build()
var server = retrofit.create(APIInterface::class.java)
가장 먼저 사용할 서버의 주소를 지정해주어야 한다.
그리고 retrofit과 위에서 정의한 APIInterface를 결합해주도록 하자.
이 작업들이 끝낫다면 실제로 버튼을 눌럿을 때 이벤트가 발생하도록 코드를 작성해보도록 하자.
binding.btnGet.setOnClickListener {
server.getRequest("name").enqueue(object:Callback<ResponseDC>{
override fun onFailure(call: Call<ResponseDTO>, t: Throwable) {
}
override fun onResponse(call: Call<ResponseDTO>, response: Response<ResponseDC>) {
Log.d("response : ", response?.body().toString())
}
})
}
binding.btnPost.setOnClickListener {
server.postRequest("id", "password").enqueue((object:Callback<ResponseDC>{
override fun onFailure(call: Call<ResponseDTO>, t: Throwable) {
}
override fun onResponse(call: Call<ResponseDTO>, response: Response<ResponseDC>) {
Log.d("response : ", response?.body().toString())
}
}))
}
binding.btnUpdate.setOnClickListener {
server.putRequest("board", "내용").enqueue((object:Callback<ResponseDC>{
override fun onFailure(call: Call<ResponseDTO>, t: Throwable) {
}
override fun onResponse(call: Call<ResponseDTO>, response: Response<ResponseDC>) {
Log.d("response : ", response?.body().toString())
}
}))
}
binding.btnDelete.setOnClickListener {
server.deleteRequest("board").enqueue((object:Callback<ResponseDC>{
override fun onFailure(call: Call<ResponseDTO>, t: Throwable) {
}
override fun onResponse(call: Call<ResponseDTO>, response: Response<ResponseDC>) {
Log.d("response : ", response?.body().toString())
}
}))
}
작성이 끝났다면 이를 받아서 처리할 Node.js코드를 작성해주자.
var express = require('express')
var http = require('http');
var app = express();
var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended: false}))
app.get(`/`, (req, res) => {
console.log(req.query);
res.send({"result": "GET 호출"});
})
app.post(`/`, (req, res) => {
console.log(req.body);
res.send({"result": "POST 호출"});
})
app.put(`/:id`, (req, res) => {
console.log(`내용 PrimaryKey : ${req.params.id}`)
console.log(req.body);
res.send({"result": "UPDATE 호출"});
})
app.delete(`/:id`, (req, res) => {
console.log(req.params.id);
console.log(req.path)
res.send({"result": "DELETE 호출"});
})
app.listen(3000, () => {
console.log(`서버 실행, 포트 번호 3000`);
});
이제 프로그램을 실행시켜서 서버와 실제로 통신을 진행해보도록 하자.
전송한 데이터가 서버와 Log에 정상적으로 찍히는 것을 볼 수 있다.
'안드로이드 > 개발관련(Kotlin)' 카테고리의 다른 글
안드로이드 ViewPager2 + TabLayout를 사용한 스와이프 메뉴 (0) | 2023.03.28 |
---|---|
안드로이드 No matching variant of com.android.tools.build:gradle:* was found 오류 해결법 (0) | 2023.03.28 |
안드로이드 타이틀바 없애는법 (0) | 2023.02.28 |
안드로이드 ViewBinding (0) | 2023.02.28 |
안드로이드 스튜디오 Github연동하기 (0) | 2023.02.27 |