안녕하세요 오늘은 레트로핏2를 이용한 서버와 안드로이드 간에 통신을 할 수 있는 코드 예제를 포스팅하겠습니다.
깃허브에 있는 레트로핏 공식문서 주소
https://square.github.io/retrofit/
레트로핏은 안드로이드에서 서버와의 통신을 위한 라이브러리입니다.
다른 라이브러리인 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이름");
?>
들어와 주셔서 감사합니다.
-포스팅이 도움이 되셨으면 좋아요나 댓글 남겨주시면 감사하겠습니다.
-피드백 환영
'안드로이드 공부 & 앱' 카테고리의 다른 글
[안드로이드] JetPack Navigation 개념 정리 및 예제 (0) | 2022.04.16 |
---|---|
[안드로이드] 버튼 클릭 리스너로 확인하는 옵저버 패턴-1편 (0) | 2022.04.13 |
운동친구 어플 레이아웃 설계화면 (0) | 2022.02.12 |
[안드로이드/코틀린] activityResultLauncher(ActivityForResult 대체) (0) | 2022.02.02 |
[안드로이드/코틀린] 카메라/갤러리 사진 이미지뷰에 로딩하기 (0) | 2022.01.28 |
댓글