Kotlin

retrofit2 php에서 데이터 가지고 오고기2

Machine_웅 2018. 12. 26. 14:44
728x90
반응형

안드로이드로  작업을 하다보면,  서버로 부터 데이터를 받아오려는 경우가 있는데.

일반적으로 json 으로 파싱해서 받아오게 된다. 

 

하지만 retrofit 에서는 객체자체도 받아올수 있도록 해주는데

물론,  DB에서 데이터 탐색을 하고, 배열에 담아서 보내야 한다

( 다른 방법이 있는지는 모르겠지만,  필자는 이렇게 했습니다. )

 

 

먼저 

 

<안드로이드>

 

- 방의 데이터를 가지고 오도록 서버와의 연결

 

// 방데이터 가지고 오기
fun getRoomListDataHttp(loginUserData : UserData){
class connectServer2 : AsyncTask<Void, Void, String>() {

override fun doInBackground(vararg params: Void?): String {

Log.d("방 리스트 목록 받기 ","받기시도 중")

var gson: Gson = GsonBuilder()
.setLenient()
.create()

//creating retrofit object
var retrofit =
Retrofit.Builder()
.baseUrl(ipAdd)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()

//creating our api
var server = retrofit.create(retrofit_interface::class.java)


server.getRoomList_oneChattingRoom(3, loginUserData.user_Id).enqueue(object : Callback<MutableList<one_room_data>> {
override fun onFailure(call: Call<MutableList<one_room_data>>, t: Throwable) {
Log.d("방 리스트 목록", "실패")
Log.d("방 리스트 목록 실패", "" + t.printStackTrace())
Log.d("방 리스트 목록 실패", "" + t.localizedMessage)

}

override fun onResponse(call: Call<MutableList<one_room_data>>, response: retrofit2.Response<MutableList<one_room_data>>) {
Log.d("방 리스트 목록 성공", "성공" + response.body().toString())

// Todo 받은걸 리스트 처리 해야하는데..?

var testList : MutableList<one_room_data>? = response.body()
// var testList : one_room_data? = response.body()
Log.d("방 리스트 결과 갯수 ",""+testList!!.size)

Log.d("방 결과 확인",testList.get(0).one_Room_no)
Log.d("방 결과 확인",testList.get(0).one_Room_FriendData.friend_Email)
Log.d("방 결과 확인",testList.get(0).one_Room_FriendData.friend_Profile)
Log.d("방 결과 확인",testList.get(0).one_Room_FriendData.friend_Nick)
Log.d("방 결과 확인",testList.get(0).one_Room_FriendData.friend_ProfileBackGround)
Log.d("방 결과 확인",""+testList.get(0).aCount)
Log.d("방 결과 확인",""+testList.get(0).bCount)



// friend_DataArray.add
// var getDataArray : List<one_room_data>? = response.body()

// Log.d("방 리스트 목록 성공",getDataArray!!.size.toString())


}
})

return "완료"
}
}

var cServer: connectServer2 = connectServer2()
cServer.execute()

}

 

- 받는 형식 지정

- 방 데이터를 받을 서식? 클래스

 


class one_room_data :Serializable {

// 방번호
@SerializedName("roomNo")
@Expose
var one_Room_no : String


// 방에 있는 친구 정보
@SerializedName("friend_data")
@Expose
var one_Room_FriendData : friend_data

// 로그인 사용자가 읽은 수 AreadCount
@SerializedName("AreadCount")
@Expose
var aCount : Int

// 상대 사용자가 읽은 수 BreadCount
@SerializedName("BreadCount")
@Expose
var bCount : Int

constructor(one_Room_no: String, one_Room_FriendData: friend_data, aCount: Int, bCount: Int) {
this.one_Room_no = one_Room_no
this.one_Room_FriendData = one_Room_FriendData
this.aCount = aCount
this.bCount = bCount
}
}

 

- 친구 정보를 담은 데이터 서식? 클래스

 


class friend_data : Serializable {


@SerializedName("friend_Email")
@Expose
var friend_Email : String

@SerializedName("friend_Nick")
@Expose
var friend_Nick : String

@SerializedName("friend_Profile")
@Expose
var friend_Profile : String

@SerializedName("friend_ProfileBackGround")
@Expose
var friend_ProfileBackGround : String

@SerializedName("friend_Status")
@Expose
var friend_Status : String

@SerializedName("friend_PhoneNumber")
@Expose
var friend_PhoneNumber : String

@SerializedName("friend_phoneMode")
@Expose
var friend_phoneMode : String

@SerializedName("friend_searchMode")
@Expose
var friend_searchMode : String

constructor(friend_Email: String, friend_Nick: String, friend_Profile: String, friend_ProfileBackGround: String, friend_Status: String, friend_PhoneNumber: String, friend_phoneMode: String, friend_searchMode: String) {
this.friend_Email = friend_Email
this.friend_Nick = friend_Nick
this.friend_Profile = friend_Profile
this.friend_ProfileBackGround = friend_ProfileBackGround
this.friend_Status = friend_Status
this.friend_PhoneNumber = friend_PhoneNumber
this.friend_phoneMode = friend_phoneMode
this.friend_searchMode = friend_searchMode
}
}

 

retrofit2 interface 클래스

 

// 채팅방 리스트 가지고 오기
@FormUrlEncoded
@POST("one_ChattingRoom/CheckOneRoom.php/")
fun getRoomList_oneChattingRoom(
@Field("mode") mode: Int,
@Field("loginUserId") loginUserId: String
): Call<MutableList<one_room_data>>

 

 

< php >

 

 $getData =  "SELECT * FROM one_chatting_room WHERE AId = '$myId'  OR  BId ='$myId' ";
  $roomResult = mysqli_query($conn,$getData);  // 쿼리 날리기
  $isExist = mysqli_num_rows($roomResult);
  $resultArray = array();

  $roomNo = "없음";
  $friend_Email = "없음";
  $friend_Nick = "없음";
  $friend_Profile = "없음";
  $friend_ProfileBackGround = "없음";
  $friend_Status = "없음";
  $friend_PhoneNumber = "없음";
  $friend_phoneMode = "없음";
  $friend_searchMode = "없음";
  $AreadCount = "없음";
  $BreadCount = "없음";

 

  // 방번호  친구 데이터 정보, A읽은 카운터 , B읽은 카운터

  if($isExist <= 0 ){
   array_push($resultArray,array(
    'roomNo'=>"없음",
    'friend_data'=>array(
     'friend_Email'=>$roomNo,
     'friend_Nick' => $friend_Nick,
     'friend_Profile' => $friend_Profile,
     'friend_ProfileBackGround' =>$friend_ProfileBackGround,
     'friend_Status' => $friend_Status,
     'friend_PhoneNumber' =>$friend_PhoneNumber,
     'friend_phoneMode' => $friend_phoneMode,
     'friend_searchMode' => $friend_searchMode
     ),
    'AreadCount'=>$AreadCount,
    'BreadCount'=>$BreadCount
    )
   );
  }else{
   // 중첩 while 문,    타겟 A를 사용자로 바꿔서 넣자.
   // 친구 리스트
   while($roomData = $roomResult->fetch_array() ){
    $roomNo = $roomData['roomNo'];

    if( $roomData['AId'] == $loginUserId){
     $friend_Email =  $roomData['Bid'];
     $AreadCount =  $roomData['AreadCount'];
     $BreadCount  =  $roomData['BreadCount'];
    }else{
     $friend_Email = $roomData['AId'];
     $AreadCount =  $roomData['BreadCount'];
     $BreadCount  =  $roomData['AreadCount'];
    }

    $getData2 = "SELECT * FROM `useraccount` WHERE `userEmail` = '{$friend_Email}' ";
    $userResult = mysqli_query($conn,$getData2);  // 쿼리 날리기

    // 친구데이터.
    while($userData = $userResult ->fetch_array()){

     // $loginUserId;
     $friend_Nick = $userData['userNick'];
     if($friend_Nick == "" OR $friend_Nick == null){
      $friend_Nick  ="닉네임없음";
     }

     $friend_Profile = $userData['userProfile'];
     if($friend_Profile == "" OR $friend_Profile == null){
      $friend_Profile  ="프로필없음";
     }

     $friend_ProfileBackGround = $userData['userProfileBackground'];

     if($friend_ProfileBackGround == "" OR $friend_ProfileBackGround == null){
      $friend_ProfileBackGround  ="배경없음";
     }

     $friend_PhoneNumber = $userData['userPhone'];

     if($friend_PhoneNumber == "" OR $friend_PhoneNumber == null){
      $friend_PhoneNumber  ="번호없음";
     }


     $friend_Status =  $userData['statusMessage'];

     if($friend_Status == "" OR $friend_Status == null){
      $friend_Status  ="상태메세지없음";
     }

     $friend_searchMode =  $userData['searchMode'];
     $friend_phoneMode =    $userData['openPhoneMode'];

    }


    array_push($resultArray,array(
     'roomNo'=>$roomNo,
     'friend_data'=>array(
      'friend_Email'=>$friend_Email,
      'friend_Nick' => $friend_Nick,
      'friend_Profile' => $friend_Profile,
      'friend_ProfileBackGround' =>$friend_ProfileBackGround,
      'friend_Status' => $friend_Status,
      'friend_PhoneNumber' =>$friend_PhoneNumber,
      'friend_phoneMode' => $friend_phoneMode,
      'friend_searchMode' => $friend_searchMode
      ),
     'AreadCount'=>$AreadCount,
     'BreadCount'=>$BreadCount
     )
    );
   } // 친구리스트 탐색 끝
  } // else 문 끝

  $json = json_encode($resultArray, JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
  return $json;

 } // 메소드 끝

 

 

 

발생했던 이슈,

아무래도 받아야 할 데이터의 수는 여러개이면서 배열을 포함한 배열이었다.

 

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

 

이런 에러로그로 나의 마음을 아프게 했다. 

해석을 해보면  기본적인 배열을 예상했으나,  이것은 오브젝트다 이말이야.

 

 

그래서

 

 $json = json_encode($resultArray, JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);

 

방식으로  변경을 하였고,

 

안드로이드에서는

MutableList<one_room_data>

이런식으로  받았다.

 


 

728x90
반응형