본문 바로가기
프로그래밍/Kotlin

[RetroFit] HTTP, Android -> Spring 데이터 통신

by Youngs_ 2021. 12. 7.

androidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.eyedoc">
 
    <!--    retrofit 사용을 위한 인터넷 사용권한 추가-->
    <uses-permission android:name="android.permission.INTERNET" />
 
    <application
        ...블라블라 기존에있는 내용
    </application>
 
</manifest>

//////////////////////////////////
// 아래코드는 선택사항입니다. https뿐만아니라 http도 접속가능하게 해주는 코드
  <application
        android:"블라블라"
        .
        .
        .
        android:usesCleartextTraffic="true">
        
        
    </application>

build.gradle

dependencies {
	//Retrofit - default
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    //Retrofit - gson
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}

 

interface 정의

import retrofit2.Call
import retrofit2.http.*

interface RetrofitService {
    //post1
    // 매개변수를 미리 정해두는 방식
    @FormUrlEncoded
    @POST("/test")
    fun postRequest(
        @Field("id") id: String,
        @Field("pw") pw: String
    ): Call<ResponseDTO>

    //post2
    // 호출하는 곳에서 매개변수를 HashMap 형태로 보내는 방식
    @POST("{path}")
    fun connectRequest(
        @Path("path") retrofitPath: String,
        @Body parameters: HashMap<String, Any>
    ): Call<ResponseDTO>
}

 

object정의

import android.util.Log
import com.google.gson.GsonBuilder
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

// baseUrl은 예시로 localhost 프로젝트 링크를 넣어서 테스트했습니다.
suspend fun connectNetwork(path : String, param : JsonObject
                               , context : Context // 실패했을때 토스트메시지를 띄워주기 위한 컨텍스트
                               , onSuccess : () -> Unit // 성공했을때 실행할 함수(이벤트)
    ){
        // 호출하는 곳에서 매개변수를 HashMap 형태로 보내는 방식
        // 서버에서 보낸 JSON의 Key값을 가져옴
        RetrofitInstance.SERVER.connectRequest(path, param).enqueue(object : Callback<ResponseDTO>{
            override fun onResponse(call: Call<ResponseDTO>?, response: Response<ResponseDTO>?) {

                Log.d("Retrofit", "$path 요청성공")

                if(response!!.isSuccessful) {
                    resultString = response.body()?.returnValue.toString()
                    onSuccess()

                }
                else {
                    Toast.makeText(context, "서버와 연결을 시도했으나 실패했습니다.", Toast.LENGTH_SHORT).show()
                }

                NetworkConnect.endProgress()

            }
            override fun onFailure(call: Call<ResponseDTO>?, t: Throwable?) {
                NetworkConnect.endProgress()
                Toast.makeText(context, "인터넷 연결을 확인하여주십시오.", Toast.LENGTH_SHORT).show()
                Log.d("Retrofit", "$path 요청실패")
            }
        })
    }

 

object Define {
    val BASE_URL : String = "http://10.0.2.2:8080/프로젝트명/"
}

object RetrofitInstance {
    val gson = GsonBuilder().setLenient().create()
    val okHttpClient = OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS).readTimeout(30,TimeUnit.SECONDS).writeTimeout(30,TimeUnit.SECONDS).build() // n초동안 기다리도록 만드는 변수
    val RETROFIT = Retrofit.Builder().baseUrl(Define.BASE_URL).client(okHttpClient).addConverterFactory(GsonConverterFactory.create()).build() // BASE_URL에 접근하기 위한 변수
    val SERVER : RetrofitService = RetrofitInstance.RETROFIT.create(RetrofitService::class.java) // RetrofitService에 만든 서비스를 사용하기 위한 변수
}

데이터클래스 생성

ResponseDTO.kt

data class ResponseDTO (var id : String, var pw : String )

 

Server쪽 Controller 코드

	@RequestMapping(value="/login.do")
	public @ResponseBody HashMap<String, Object> connectTest(HttpServletRequest request, @RequestBody HashMap<String, Object> param)
	{
		
		HashMap<String, Object> returnValue = new HashMap<String, Object>();
		
		System.out.println("HashMap 값 : " + param);
		returnValue.put("id", param.get("id").toString());
		returnValue.put("pw", param.get("pw").toString());
		
		System.out.println("Json 값 : " + returnValue);
		
		return returnValue;
	}

참고링크 

https://morm.tistory.com/296

 

안드로이드 RetroFit Post Java 적용 순서, 예제

간단하게 RetroFit Post 적용할 수 있는 순서에대한 설명글입니다. 기반지식이 없는 상태에서 Retrofit을 적용하려니 꽤 힘들었었습니다. 그래서 답답했던 마음에, 혹시라도 저처럼 해매지 마시라고,

morm.tistory.com

https://todaycode.tistory.com/41

 

레트로핏을 이용하여 서버와 통신하자!

1. 사용법  1-1. Interface 정의  1-2. Retrofit 객체 생성  1-3. HTTP 요청과 응답 2. 예제 소스 이번 게시물에서는 Retrofit을 이용하여 버튼을 누를 때마다 다음 페이지의 공지사항을 불러와서 띄우는 기..

todaycode.tistory.com

 

'프로그래밍 > Kotlin' 카테고리의 다른 글

[Kotlin] 안드로이드 자동로그인 코드  (0) 2021.12.09
Json데이터 생성 및 Gson 사용  (0) 2021.12.07
중첩클래스 사용이유  (0) 2021.11.26
[Kotlin] 제네릭(Generic)  (0) 2021.11.18
스레드와 코루틴의 차이  (0) 2021.11.05

댓글