ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] Firebase로 REST API 공부하기(+ Postman, Alamofire) - 1. GET
    공부기록/iOS 2021. 9. 1. 00:26

    Firestore로 만들었으며, UserCollection이라는 컬렉션에 Document는 user1,2,3... 으로 만들고

    필드는 email과, name, nickname으로 이루어져있다.

    출처 - https://firebase.google.com/docs/firestore/use-rest-api?hl=ko

    Firestore Rest API라고 검색하면 구글에서 만든 문서가 나온다.

    문서에서는 기본 URL은 https://firestore.googleapis.com/v1/라고 한다.

    호출 메서드마다 그 뒤의 URL 구조는 바뀐다.

    출처 - https://cloud.google.com/firestore/docs/reference/rest/?apix=true#rest-resource:-v1.projects.databases.documents

    Document에 관한 Firestore Rest API 문서는 여기서 볼 수 있다.

    먼저 GET을 호출해보기 위해서 get을 확인해본다.

    GET 설명문서

    Parameters의 name에 projects/{project_id}/databases/{database_id}/documents/{document_path} 라고 예시가 나온다.

    project_id는 프로젝트 설정에서 확인할 수 있고,

    database_id는 (default),

    document_path는 user1만 확인할 것이므로 UserCollection/user1로 한다.

    그럼 기본 URL + name을 하면

    https://firestore.googleapis.com/v1/projects/fir-restapi-8d2ba/databases/(default)/documents/UserCollection/user1

    이라는 URL로 사용하면 된다.

     

     

    먼저 포스트맨을 이용해 GET 메서드로 호출해본다.

    호출에 성공하면 Pretty한 JSON으로 호출 결과를 볼 수 있다.

    "name", "fields", "createTime", "updateTime"으로 이루어져 있고,

    "fields"는 또 "nickname", "email", "name"으로 이루어져있다.

    필드가 위에 데이터베이스에서 봤던 그 필드다.

    필드의 각 요소들은 또 다시 "stringValue"를 가지고 있다.

    이거를 Alamofire을 이용해서 호출해봤다.

     

    왼쪽 이미지는 Response 모델인데 괴상하게 생긴건 위에서 봤던 필드 요소들이 stringValue를 가지고 있기 때문이다.

     

    알아보기 쉽게 구분하고 싶어서 이렇게 만들었지만

    구조체를 Name, Email, Nickname 구조체를 각각 만드는것보다는 StringValue라는 Codable 구조체 하나를 만들고,

    Fields의 name, email, nickname을 StringValue 구조체로 만들어도 된다.

     

    private let path = Bundle.main.url(forResource: "GoogleService-Info", withExtension: "plist")
    
    private var dataURL: String {
        let data = try!  Data(contentsOf: path!)
        let plist = try! PropertyListSerialization.propertyList(from: data, options: [], format: nil) as! [String : Any]
        return "https://firestore.googleapis.com/v1/projects/\(plist["PROJECT_ID"]!)/databases/(default)/documents/UserCollection"
    }

    이 부분의 코드는 Firebase 프로젝트 만들때 받는 plist에서 PROJECT_ID를 이용해서 URL을 만든 부분이다.

    API KEY 같이 감추고 싶은 부분은 이런식으로 감추는게 좋을거 같아서 이렇게 했다.

    PROJECT_ID는 어차피 위에서 다 나왔지만 깃헙에 올리거나 코드를 공개할때 이런식으로 하면 좋을거 같다.

    이 Firebase 프로젝트는 블로그 글이 공개되면 삭제할 것이다.

    func getDocumentData(documentID: String) {
            
        AF.request(dataURL + "/" + documentID, method: .get).responseJSON { response in
            print("\n\n\n Getting Document Data... \n\n\n")
            if let error = response.error {
                print(error)
            }
            else if let data = response.data {
                guard let apiResponse = try? JSONDecoder().decode(APIResponse.self, from: data) else {
                    print("decode fail")
                    return
                }
                print(" name : \(apiResponse.fields.name.stringValue)")
                print(" nickname: \(apiResponse.fields.nickname.stringValue)")
                print(" email: \(apiResponse.fields.email.stringValue)")
                print("\n\n\n Finished")
            }
        }
    }

    이 부분이 Alamofire을 이용해서 GET 메서드로 호출한 것이다.

    이 함수의 매개변수로 documentID를 받았고 user1을 받는다.

    최종 URL은 위에서와 같이 ~UserCollection/user1 이므로 dataURL에 documentID를 합쳐준다.

    결과를 보면 user1의 name, nickname, email 제대로 나왔다.

Designed by Tistory.