app단위 build.gradle에 추가
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
인터넷 사용 퍼미션 허용(https)
<uses-permission android:name="android.permission.INTERNET"/>
http에 접근하려면 추가로 설정을 해주어야 합니다!
DTO
data class Contract(
@SerializedName("pName") var name: String,
@SerializedName("pPhoneNumber") var phoneNumber: String,
@SerializedName("pImagePath") var imagePath: String,
@SerializedName("pEmail") var email: String,
@SerializedName("pResidence") var residence: String,
@SerializedName("pMemo") var memo: String,
@SerializedName("pUpdateDate") var updateDate: String
)
응답을 받을때, @SerializedName annotation내부의 문자열을 찾아 응답값을 자동으로 객체에 주입합니다.
Retrofit 객체 초기화
class RetrofitManager {
companion object{
val retrofit = Retrofit.Builder()
.baseUrl("https://sheltered-tundra-79773.herokuapp.com")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}
ConverterFactory또한 종류가 어려가지이니, 필요에 따라 찾아 추가하시면 되겠습니다.
위에서 아래로 채에 거르듯 참조하게 되며, GsonConverter의 경우 변환이 불가해도 변환했다고 한다고 하니,
가장 하위레벨(하단)에 위치시키면 되겠습니다.
사용할 REST 타입과 정보를 인터페이스로 구축
interface RetrofitService {
@FormUrlEncoded
@POST("/download")
fun getAllContract(
@Field("device_data") phoneNo: String
) : Call<Contract>
@FormUrlEncoded
@POST("/backup")
fun putSomeContract(
@Field("person") person: String,
) : Call<String>
}
어노테이션(@)을 이용해 다양한 정보를 명시할 수 있습니다.
@FormUrlEndoded는 @Field 어노테이션을 사용해 값을 전송할때 필수적으로 입력해야하는 annotation이며,
@POST는 http method중 post요청을 하겠다는 뜻입니다.
http metohd는 모두 annotation으로 요청할 수 있으니 다른 방식으로 얼마든지 요청할 수 있습니다.
매개변수에도 다양한 annotation을 사용할 수 있으니 필요에 따라 추가로 찾아 사용하시면 됩니다.
Retrofit객체 생성 및 뷰바인딩
class MainActivity : AppCompatActivity() {
val TAG: String = "MainActivity"
lateinit var binding: ActivityMainBinding
lateinit var service: RetrofitService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
service = RetrofitManager.retrofit.create(RetrofitService::class.java)
binding.get.setOnClickListener {
getContract()
}
binding.put.setOnClickListener {
putContract()
}
}
FindByViewId 사용을 하지 않으려고 ViewBinding만 적용하였습니다.
selectAll
private fun getContract(){
var jsonObject = JSONObject()
jsonObject.put("phone", "01011112222")
var phone = jsonObject.toString()
service.getAllContract(phone).enqueue(object: Callback<Contract>{
override fun onResponse(call: Call<Contract>, response: Response<Contract>) {
if(response.isSuccessful.not()){
return
}
response.body()?.let {
Log.d(TAG, "\n${it.toString()}")
}
}
override fun onFailure(call: Call<Contract>, t: Throwable) {
Log.d(TAG, "[Fail]${t.toString()}")
}
})
}
연락처 정보를 json으로 parsing하여 request요청을 보냅니다.
결과값을 로그로 출력해줍니다.
put extra data
private fun putContract(){
var contractZip = JSONObject()
var contracts = JSONArray()
var contract = JSONObject()
contract.put("pName", "retrofit")
contract.put("pPhoneNumber", "01011112222")
contract.put("pUpdateDate", "2021-10-12")
contracts.put(contract)
contractZip.put("person", contracts)
contractZip.put("phone", "01033334444")
var person = contractZip.toString()
service.putSomeContract(person).enqueue(object: Callback<String>{
override fun onResponse(call: Call<String>, response: Response<String>) {
if(response.isSuccessful.not()){
return
}
response.body()?.let {
Log.d(TAG, "\n${it.toString()}")
}
}
override fun onFailure(call: Call<String>, t: Throwable) {
Log.d(TAG, "[Fail]${t.toString()}")
}
})
}
JsonArray에 다수의 JsonObject를 입력하고,
이를 JosnObject에 입력하여 request를 하는 코드입니다.
마찬가지로 결과값을 로그로 출력합니다.
'IDE & Framework > Android' 카테고리의 다른 글
AAC MVVM - (1)Live Data (0) | 2021.10.17 |
---|---|
View binding 사용해보기 (0) | 2021.10.17 |
[Android] SHA-1 쉽게 찾는법 (0) | 2021.10.17 |
Android에서 SQLite 사용하기 (feat.ROOM) (0) | 2021.07.30 |
AsyncTask는 왜 deprecated 되었을까? (0) | 2021.07.09 |