https://square.github.io/retrofit/
클라이언트(안드로이드)에서 서버로 검색어를 request로 주고, 원하는 객체로 response를 받는다.
건강기능식품에 대한 정보를 가진 객체로
① : m_name(건강기능식품 이름)을 주면
② : SupplementVO로 돌려받는다. (type-safe한 특징)
<uses-permission android:name="android.permission.INTERNET" />
// Gson
implementation 'com.google.code.gson:gson:2.8.5'
// Retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.7.0'
// Retrofit2-Gson converter
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
import com.google.gson.GsonBuilder
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitClient {
private var instance: Retrofit? = null
private val gson = GsonBuilder().setLenient().create()
// 서버 주소
private const val BASE_URL = "http://서버.주소.xx.xx/"
// SingleTon
fun getInstance(): Retrofit {
if (instance == null) {
instance = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
}
return instance!!
}
}
import com.example.dyno.VO.SupplementVO
import retrofit2.Call
import retrofit2.http.*
// 서버에서 호출할 메서드를 선언하는 인터페이스
// POST 방식으로 데이터를 주고 받을 때 넘기는 변수는 Field라고 해야한다.
interface RetrofitService {
@FormUrlEncoded
@POST("Supplement/List")
fun requestList(
@Field("s_name") s_name: String
) : Call<ArrayList<SupplementVO>>
@FormUrlEncoded
@POST("Supplement/Single")
fun requestSingle(
@Field("s_name") s_name: String
) : Call<SupplementVO>
}
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.dyno.OCR.CameraActivity
import com.example.dyno.View.MyPage.Detail.DetailSupplementActivity
import com.example.dyno.R
import com.example.dyno.Network.RetrofitService
import com.example.dyno.Network.RetrofitClient
import com.example.dyno.VO.SupplementVO
import kotlinx.android.synthetic.main.activity_regist_supplement.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
// process
// 0. 이름으로 검색.
// 1. RDS에 해당 건강기능 식품이 존재하는지 검사
// 2. 1.에서 있다면 바로 등록.
// 3. 1.에서 없다면 OCR 수행.
class RegistSupplementActivity : AppCompatActivity() {
private val TAG = this::class.java.simpleName
private lateinit var retrofit : Retrofit
private lateinit var supplementService : RetrofitService
private lateinit var supplementAdapter : SupplementAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_regist_supplement)
/* (어댑터 달기 등 중략) */
// 서버 연결
initRetrofit()
// 검색 버튼 클릭 시
btn_search.setOnClickListener {
// 검색어
val keyword = input_search.text.toString()
// 연결
if(keyword!="")
getSearchList(supplementService, keyword)
}
}
private fun initRetrofit(){
retrofit = RetrofitClient.getInstance()
supplementService = retrofit.create(RetrofitService::class.java)
}
private fun getSearchList(service : RetrofitService, keyword : String){
// 키워드로 검색
service.requestList(keyword).enqueue(object : Callback<ArrayList<SupplementVO>>{
override fun onFailure(call: Call<ArrayList<SupplementVO>>, t: Throwable) {
Log.d(TAG,"실패 : {$t}")
}
override fun onResponse(call: Call<ArrayList<SupplementVO>>, response: Response<ArrayList<SupplementVO>>) {
Log.d(TAG,"성공^^")
// 결과가 없을 경우
if(response.body()!!.size==0){
yes_result.visibility = View.GONE // 결과 있음 GONE
no_result.visibility = View.VISIBLE // 결과 없음 VISIBLE
}
// 결과가 있을 경우
else {
//Log.d(TAG,"사이즈 : ${response.body()!!.size}, 첫번째 인자 이름 : ${response.body()!![0].m_name}")
supplementAdapter.setNewData(response.body()!!) // 어댑터에 데이터 업데이트
yes_result.visibility = View.VISIBLE // 결과 있음 VISIBLE
no_result.visibility = View.GONE // 결과 없음 GONE
}
}
})
}
private fun getSelectedSingle(service : RetrofitService, keyword : String) {
service.requestSingle(keyword).enqueue(object : Callback<SupplementVO>{
override fun onFailure(call: Call<SupplementVO>, t: Throwable) {
Log.d(TAG,"실패 : {$t}")
}
override fun onResponse(call: Call<SupplementVO>, response: Response<SupplementVO>) {
Log.d(TAG,"성공^^ 22")
Log.d(TAG,"${response.body()!!.m_name},${response.body()!!.m_company}")
// 현재 액티비티 종료하고, 건강기능식품 디테일 액티비티로 넘어감.
val intent = Intent(applicationContext,DetailSupplementActivity::class.java)
intent.putExtra("DATA2",response.body()!!)
startActivity(intent)
finish()
}
})
}
}
힘을 내자