-
[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 메소드에서 사용할 수 있는 연산자는 다음과 같으니 활용해주시면 되겠습니다!!
'Programing > Vapor' 카테고리의 다른 글
[Vapor] Pagination 사용해보기 (0) 2020.06.19 [Vapor] SQL 문으로 쿼리문 사용하기 (0) 2020.06.19 [Vapor] Rest API 만들기 - 2 (POST) (0) 2020.05.22 [Vapor] Rest API 만들기 - 1 (0) 2020.05.22 💧Vapor💧 Heroku MySQL DB 사용하기 (0) 2020.05.11