[코틀린/Kotlin] Retrofit2 PHP MySQL 통신

[코틀린/Kotlin] Retrofit2 PHP MySQL 통신

반응형

1. app모듈의 build.gradle에 Retrofit2 Dependency 추가

Retrofit2의 최신 버전은 https://github.com/square/retrofit에서 확인할 수 있습니다.

implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // reftrofit2 dependencies 추가 implementation 'com.squareup.retrofit2:retrofit:2.9.0' // reftrofit2 dependencies 추가 implementation 'com.squareup.retrofit2:converter-scalars:2.9.0' // reftrofit2 dependencies 추가 implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' // reftrofit2 dependencies 추가

2. Manifest.xml에 INTERNET permission 추가

3. RetrofitClient Object 생성

baseUrl은 고정된 주소로 지정해줍니다. 저는 "http://IP_주소/UserInsert.php" "http://IP_주소/UserSelect.php" 등 여러 PHP과 통신을 해야하기 때문에 같이 "http://IP_주소/"를 baseUrl로 지정했습니다.

addConverterFactory(GsonConverterFactory.create(gson)) 은 Json 데이터를 POJO Class 형식으로 자동변환하기 위해 필요합니다.

import com.google.gson.GsonBuilder import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory import retrofit2.converter.scalars.ScalarsConverterFactory object RetrofitClient { private var instance : Retrofit? = null private val gson = GsonBuilder().setLenient().create() fun getInstance() : Retrofit { if(instance == null){ instance = Retrofit.Builder() .baseUrl("http://${IP_ADDRESS}/") .addConverterFactory(GsonConverterFactory.create(gson)) .build() } return instance!! } }

4. POJO Class 생성

제가 생성한 PHP 파일에서는 아래와 같은 Json 데이터를 반환합니다.

// UserSelect.php // 로그인 성공 시 echo json_encode(array( "email"=>$row["email"], "password"=>$row["password"], "username"=>$row["username"], "picture"=>$row["picture"], ), JSON_UNESCAPED_UNICODE); // 로그인 실패 시 echo json_encode(array( "status" => "false", "message" => "로그인 실패" ), JSON_UNESCAPED_UNICODE);

// 로그인 성공 시 { "email":"[email protected]", "password":"123456", "username":"RIT", "picture":"[email protected]/profile.JPG" } // 로그인 실패 시 { "status" => "false", "message" => "로그인 실패" }

위와 같은 Json 데이터를 받을 POJO Class는 아래와 같습니다. PHP에서 반환되는 Json의 Key 값과 POJO Class의 변수 이름이 같아야 합니다.

data class User ( val email : String?, val user_name : String?, val gender : String?, val picture : String?, val status : String?, val message : String? )

5. API Interface 생성

저는 POST 방식으로 PHP로 데이터를 보내고, 가져오는 것을 선택했습니다. @POST는 3번에서 지정한 baseUrl의 뒤에 오는 "UserInsert.php"이나 "UserSelect.php" 같은 상세 주소를 지정해줍니다.

Field는 POST 방식으로 PHP에 보낼 데이터의 형식을 정해줍니다.

마지막으로 PHP로부터 Json을 반환받는다면 POJO Class로 받을 수 있도록 Call를 return type으로 정해줍니다.

import retrofit2.Call import retrofit2.http.Field import retrofit2.http.FormUrlEncoded import retrofit2.http.POST interface UserAPI { @FormUrlEncoded @POST("UserSelect.php") fun getUser( @Field("email") email: String ): Call }

6. Request 보내기

3번에서 만든 RetrofitClient에서 Instance를 가져옵니다.

RetrofitClient를 통해 Inteface를 생성하고, email로 request를 날리고 response를 받습니다.

성공적으로 Response했다면 onResponse를, 실패했다면 onFailure를 통해 결과를 처리할 수 있습니다.

val retrofit = RetrofitClient.getInstance() val server = retrofit.create(UserAPI::class.java) server.getUser(email).enqueue(object : Callback { override fun onResponse( call: Call, response: Response ) { Log.d(TAG, "성공 : ${response.body()}") } override fun onFailure(call: Call, t: Throwable) { Log.d(TAG, "실패 : ${t.localizedMessage}") } })

- PHP

"false", "message" => "필수 인자가 부족합니다"), JSON_UNESCAPED_UNICODE ); } else { try { $sql="select * from user_tb where U.email like '$email'"; $stmt = $con->prepare($sql); $stmt->execute(); if ($stmt->rowCount() == 0) { echo json_encode( array( "status" => "false", "message" => "로그인 실패" ), JSON_UNESCAPED_UNICODE ); } else { while($row=$stmt->fetch(PDO::FETCH_ASSOC)) { extract($row); echo json_encode(array( "email"=>$row["email"], "password"=>$row["password"], "user_name"=>$row["user_name"], "picture"=>$row["picture"] ), JSON_UNESCAPED_UNICODE); } } } catch(PDOException $e) { die("Database error: " . $e->getMessage()); } } } ?>

결과 화면

반응형

from http://se0r1-tae27.tistory.com/99 by ccl(A) rewrite - 2021-09-13 16:26:28