ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Vapor] Rest API 만들기 - 3 (GET)
    Programing/Vapor 2020. 5. 28. 19:09

    안녕하세요, 5anniversary 입니다~!

     

    저번 시간에 POST를 활용해 데이터베이스에 데이터를 넣어줬으니 그 데이터를 받아오는 GET method에 대해 다루어 볼 거예요~!

     

    먼저 FluentMysql을 import 해주셔야 query 메소드를 사용할 수 있기 때문에 import 해주시면 되겠습니다.

     

    1. 전체 목록 받아오기

        private func getAllArticle(_ req: Request) throws -> Future<Response>{
    
            return Article
            .query(on: req) // QueryBuilder를 사용하기 위한 메소드
            .all()			// 해당 쿼리에서 모든 데이터를 받아오기 위한 메소드 
            .flatMap({ result in
    
                return try ResponseJSON<[Article]> // 배열로 Article을 받아오기 위한 처리 방식
                .init(data: result)				   // result를 넣어줌
                .encode(for: req)
    
            })
        }
    

     

    func boot(router: Router) throws {
    	
        ...code...
        
        // get
        group.get("all", use: getAllArticle) // get 메소드로 위에 만들어준 함수 사용하기
    
        ...code...
    
    }

     

    위와 같이 코드를 작성해주시고, 이제 아래와 같이 cli 명령어를 작성해주시면

    curl -X GET http://localhost:8080/article/all

    와 같은 Article 테이블의 결과 값을 반환받게 됩니다.

     

    여기서 단순하게 제목과 글 내용만을 반환받으려 합니다. 

     

    그러기 위해서는 코드를 추가해주셔야 하는데,

            return Article
                .query(on: req)
                .all()
                .flatMap({ result in
                    let article = result.compactMap({ list -> Article in // result 값을 하나씩 처리해주기 위해 compactMap을 사용합니다.
                        var list = list;	// list의 데이터에 변화를 주기 위해서 변수 list에 list 값을 넣어줍니다.
                        list.id = nil	// article의 id를 빈 값으로 만들어줍니다.
                        return list		// 변화를 준 list를 반환해줍니다.
                    })
    
                return try ResponseJSON<[Article]>
                    .init(data: article)	// 위에 코드에서 result였던 데이터를 새롭게 처리해준 article로 바꾸어줍니다.
                    .encode(for: req)
            })
    

    와 같이 코드를 추가해주시면

    id 값이 사라진 response를 받아보실 수 있습니다.

     

    2. 정렬해 받아오기

     

    원하는 컬럼을 정해 정렬을 해준 값을 가져오고 싶을 경우가 있습니다.

     

    그럴 경우에는 sort 메소드를 사용해주시면 되는데.

     

        private func getAllreveseArticle(_ req: Request) throws -> Future<Response>{
            
            return Article
                .query(on: req)
                .sort(\.id, .descending)	// id컬럼을 이용해 , 내림차순으로 정렬
                .all()
                .flatMap({ result in
                
                return try ResponseJSON<[Article]>
                    .init(data: result)
                    .encode(for: req)
            })
        }
    

     

    id 컬럼을 이용해 내림차순으로 정렬한 코드입니다.

     

    func boot(router: Router) throws {
    	
        ...code...
        
        // get
        group.get("reverse", use: getAllreveseArticle)
    
        ...code...
    
    }

    와 같이 새로운 라우터를 추가해주시고

     

    curl -X GET http://localhost:8080/article/reverse

    와 같이 CLI 명령어를 사용해주시면

     

    id 컬럼이 내림차순으로 정렬이 된 response값을 받아보실 수 있습니다.

     

    3. 특정 컬럼의 특정 조건에 일치하는 response 받아오기

     

    해당 경우에는 filter라는 메소드를 사용할 것입니다.

     

    우선 parameter의 값을 받아오는 방법을 알아보겠습니다.

     

    guard let id = req.query[Int.self, at: "id"] else {
    	throw Abort(.badRequest, reason: "Missing id in request")
    }
            
    let id2 = try req.query.get(Int.self, at: "id2")
    

    받아오는 방법을 2가지가 있습니다

     

    1 번째 방법을 사용하고 파라미터에 알맞은 값을 넣어주지 않으면

    2 번째 방법을 사용하고 파라미터에 알맞는 값을 넣어주지 않으면

    와 같이 반환 값이 다르게 되니 원하시는 방법을 선택해 사용해주시면 되겠습니다.

     

        private func getArticle(_ req: Request) throws -> Future<Response>{
            
            guard let id = req.query[Int.self, at: "id"] else {
                throw Abort(.badRequest, reason: "Missing id in request")
            }
            
            return Article
                .query(on: req)
                .filter(\.id == id)	// 파라미터에 받아온 id값과 일치하는 것을 찾아주는 filter 메소드
                .all()
                .flatMap({ result in
    
                return try ResponseJSON<[Article]>.init(data: result).encode(for: req)
    
            })
        }
    

    와 같이 사용해주시고

    func boot(router: Router) throws {
    
    	...code...
    
    	group.get("id", use: getArticle)
    
    	...code...
        
    }

    라우터를 추가해주신 다음

     

    curl -X GET http://localhost:8080/article/id\?id\=2

    와 같이 CLI 명령어를 사용해주시면

     

     

    두 번째 id에 해당하는 게시글을 받아오실 수 있습니다.

     

    또한

    filter 메소드에서 사용할 수 있는 연산자는 다음과 같으니 활용해주시면 되겠습니다!!

    댓글

Designed by Tistory.