본문 바로가기
안드로이드 공부 & 앱

[Android/코틀린/PHP] Retrofit2를 이용한 간단한 서버 클라이언트 통신 예제

by 문톰 2021. 12. 5.

 

 

 

 

안녕하세요 오늘은 레트로핏2를 이용한 서버와 안드로이드 간에 통신을 할 수 있는 코드 예제를 포스팅하겠습니다.

 

깃허브에 있는 레트로핏 공식문서 주소

https://square.github.io/retrofit/

 

Retrofit

A type-safe HTTP client for Android and Java

square.github.io

 

레트로핏은 안드로이드에서 서버와의 통신을 위한 라이브러리입니다.

다른 라이브러리인 Volley 보다 사용하는 방법이 조금 복잡하지만 성능적인 부분이 레트로핏이 좋고

현업에서는 주로 레트로핏을 많이 쓴다고 하네요.

 

1. build.gradle(Module: app)

dependencies {
//retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
//Gson
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

 

2.Manifest 설정

<Manifest 
<!-- 1) 인터넷 사용권한 -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- 2) 네트워크 트래픽 사용 허용 -->
<application
android:usesCleartextTraffic="true"

 

 

3.MainActivity

class MainActivity : AppCompatActivity(), View.OnClickListener {

val binding by lazy { 엑티비티이름.inflate(layoutInflater) }
  val api by lazy { APIS.create() }
  
    override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(binding.root)


      //post로 보내기버튼 리스너
      binding.postbutton.setOnClickListener(this)
  }
  
  
   //버튼 클릭 리스너 메서드
  override fun onClick(v: View?) {
      when (v?.id) {
      //포스트로 보내기 버튼
          binding.postbutton.id -> {
           
           //Post방식으로 서버에 전달할 데이터를 파라미터에 입력
              api.post_users(
                  binding.idedt.text.toString(), // EditText1
                  binding.nickedt.text.toString(), //EditText2
                  binding.pwdedt.text.toString(), //EditText3
              ).enqueue(object : Callback<PostModel> {
              //서버 요청 성공 
                  override fun onResponse(
                      call: Call<PostModel>,
                      response: Response<PostModel>
                  ) {
                      Log.d(TAG, response.toString())
                      Log.d(TAG, response.body().toString())
                      if (!response.body().toString().isEmpty())
                          binding.text.setText(response.body().toString());
                  }
                  //서버 요청 실패 ㅠ
                  override fun onFailure(call: Call<PostModel>, t: Throwable) {
                      Log.d(TAG, t.message.toString())
                  }
              })
          }
          else -> {
          }
      }
  }
  
}

 

 

4.MyApp.class

//static 변수를 담아놓은 클래스
object MyApp {
    const val TAG: String = "로그"

    // * 서버에 있는 php 파일 위치  
   //  ! 서버 IP 제외
   // ex) /파일명.php
    const val Example_url: String = "/파일명.php"

}

5.APIS

interface APIS {
	//post -> php 파일 주소
    @FormUrlEncoded
    @POST(MyApp.Example_url)
    @Headers(
        "accept: application/json",
        "content-type: application/x-www-form-urlencoded; charset=utf-8"
    )

    //post로 서버에 데이터를 보내는 메서드
    fun post_users(
        // 서버에 Post방식으로 보낼 떄 사용하는  파라미터의 키 값
       //ex)@Field('키') =>  $_POST['키']  
        @Field("키1") nick: String,
        @Field("키2") pwd: String,
        @Field("키3") id: String
    ): Call<PostModel>


    companion object { // static 처럼 공유객체로 사용가능함. 모든 인스턴스가 공유하는 객체로서 동작함.
      //서버 IP만 입력해주세요~  
      private const val BASE_URL = "http://서버IP"
        fun create(): APIS {
            val gson: Gson = GsonBuilder().setLenient().create();
            return Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build()
                .create(APIS::class.java)
        }
    }
}

6.PostModel.class

// * SerializedName: 서버(PHP)에서 안드로이드에 응답할 때 보내는 배열(객체)의 키
    //ex) array("id" => "$id" , "pwd" => "$pwd", "nick" => "$nick")
    // * 위의 PHP 코드에서 "id"  부분이 serializedName('파라미터값')의 파라미터 값 입니다.
    
data class PostModel(
    @Expose
    @SerializedName("id")
    var id: String? = null,
    @Expose
    @SerializedName("pwd")
    var pwd: String? = null,
    @Expose
    @SerializedName("nick")
    var nick: String? = null,
)

 

7.Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".Activity.MainActivity">

    <EditText
        android:id="@+id/idedt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:hint="아이디 입력"
        tools:layout_editor_absoluteY="55dp" />

    <EditText
        android:id="@+id/nickedt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:hint="닉네임입력"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.482"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="134dp" />

    <EditText
        android:id="@+id/pwdedt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:hint="패스워드입력"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.508"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="212dp" />


    <Button
        android:id="@+id/postbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="post요청"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="460dp" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="초기값"
        android:textAlignment="center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="611dp" />
</LinearLayout>

 

8.Example.php

<?php
header("Content-type:application/json");
require_once 'example_con.php';

if($_SERVER['REQUEST_METHOD'] == 'POST'){
  // * 안드로이드에서 보내온 데이터를 Post방식으로 받는다.  
  $id = $_POST['id'];
  $nick = $_POST['nick'];
  $pwd = $_POST['pwd'];
  
  // * JSON 형식으로 변환해서 안드로이드에 응답을 보낸다.
    echo json_encode(array("id" => "$id" , "pwd" => "$pwd", "nick" => "$nick"));
}

 

9.Example_con.php

<?php
$con = mysqli_connect("서버IP", "계정", "DB비밀번호", "DB이름");
?>

 

들어와 주셔서 감사합니다.

-포스팅이 도움이 되셨으면 좋아요나 댓글 남겨주시면 감사하겠습니다.

-피드백 환영

 

댓글