[안드로이드] Retrofit2를 이용해서 서버와 통신하기

박서현·2021년 6월 7일
0

안드로이드

목록 보기
9/9
post-thumbnail
post-custom-banner

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);
?>
profile
차곡차곡 쌓아가기
post-custom-banner

0개의 댓글