Retrofit 사용법
// 의존성 추가
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
retrofit을 이용하기 위해서 필요한 3가지
❗ 서버로부터 받을 응답 구조를 구현한 모델 클래스 -> 필수X
❗ API
❗ 서버로 보낼 데이터 구조를 구현한 모델 클래스 -> 필수X
안드로이드 코드
⭐ PostModel class
import com.google.gson.annotations.SerializedName;
public class PostModel {
@SerializedName("postId")
String postId;
@SerializedName("post")
String post;
@SerializedName("imageList")
String imageList; // 문자열로 변환된 JsonArray를 전달받을 예정
@SerializedName("urlList")
String urlList; // 문자열로 변환된 JsonArray를 전달받을 예정
@SerializedName("cntLike")
int cntLike;
@SerializedName("publisher")
String publisher;
@SerializedName("uploadDate")
String uploadDate; // mysql에서 datetime은 문자열로 전송된다.
public String getPostId() {
return postId;
}
public String getPost() {
return post;
}
public String getImageList() {
return imageList;
}
public String getUrlList() {
return urlList;
}
public int getCntLike() {
return cntLike;
}
public String getPublisher() {
return publisher;
}
public String getUploadDate() {
return uploadDate;
}
}
⭐ PostAPI interface (보내는 데이터가 없는 경우)
import [패기지명].PostModel;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.POST;
public interface PostAPI {
@POST("get_post.php") // @전송방식(데이터를 전송할 서버 파일명)
Call<List<PostModel>> getPost(); // Call<응답받을 데이터형> 함수명(서버에 전달할 데이터)
}
⭐ LikeAPI interface (보내는 데이터가 있는 경우)
import [패키지명].LikeModel;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface LikeAPI {
@FormUrlEncoded
@POST("save_like.php")
Call<LikeModel> savaLike(@Field("postId") String postId,
@Field("email") String email,
@Field("mode") String mode);
/* @Field(서버에서 데이터 받을 키값) 을 입력한다.
* 서버에서 $변수명 = $_POST["키값"]; 로 데이터를 받는다. */
}
⭐ RetrofitClient class
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient {
private final static String BASE_URL = "https://www.example.com/"; // 서버 URL
private static Retrofit retrofit = null;
private RetrofitClient() {
}
public static Retrofit getClient() {
if(retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
⭐ 서버에서 데이터 가져오기
Retrofit retrofit = RetrofitClient.getClient();
PostAPI postAPI = retrofit.create(PostAPI.class);
PostAPI.getPost().enqueue(new Callback<List<PostModel>>() {
@Override
public void onResponse(@NonNull Call<List<PostModel>> call, @NonNull Response<List<PostModel>> response) {
if(response.isSuccessful()) {
// 서버로부터 전달받은 데이터
List<PostModel> list = response.body();
...
}
}
@Override
public void onFailure(@NonNull Call<List<PostModel>> call, @NonNull Throwable t) {
t.printStackTrace();
}
});
서버 php 코드
실제 사용한 코드에서 많은 부분을 삭제하고, 큰 틀만 남겨두었다.
⭐ get_post.php
<?php
include "connect_db.php";
$response = array();
$sql = "select * from post_tbl order by uploadDate desc";
$res = mysqli_query($connect, $sql);
while($row = mysqli_fetch_object($res)) {
$response[] = $row;
}
mysqli_close($connect);
echo json_encode($response);
?>
⭐ save_like.php
<?php
include "connect_db.php";
$postId = $_POST['postId'];
$email = $_POST['email'];
$mode = $_POST['mode'];
$response = array();
...
if(성공) {
$response["success"] = true;
$response["like"] = 10;
} else {
$response["success"] = false;
$response["like"] = 0;
}
...
mysqli_close($connect);
echo json_encode($response);
?>