Programing/Vapor

[Vapor] Rest API 만들기 - 2 (POST)

5주년 2020. 5. 22. 03:08

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

 

이번 시간에는 지난번에 만들어둔 RespnseJSON을 활용해

 

GET, POST...HTTP method를 이용해 DB에 저장하고 불러오는 API를 만들어보겠습니다!!

 

 

우선 User 모델이 아닌 Article이라는 게시글 형태의 모델을 하나 작성하도록 하겠습니다.

import Vapor
import FluentMySQL

struct Article {
    var id: Int?
    var title: String?
    var content: String?
}

extension Article: Content {}
extension Article: Migration {}
extension Article: MySQLModel {
    typealias Database = MySQLDatabase
}

당연히 configure.swift 파일에서 마이그레이션을 해줘야겠죠??

migrations.add(model: Article.self, database: DatabaseIdentifier<MySQLDatabase>.mysql)

 

자 이제 데이터베이스에 Article 테이블이 생성된 걸 확인했으니 API 작성법을 하나씩 알아보도록 할까요??

 

ArticleController.swift를 만들어준 후 router.swift에 register 해주신 후

    try router.register(collection: ArticleController())

 

게시글을 작성하는 API를 만들어볼게요!!

 

struct ArticleContainer : Content {

    var id: Int?
    var title: String?
    var content: String?

}

사용자에게 정보를 받아올 container를 생성해주시고

 

    private func create(_ req: Request, container: ArticleContainer) throws -> Future<Response>{
        
        guard let article: Article = Article(id: nil, 
        				   // id 필드는 auto increase인 이유로 넣어줄 필요는 없습니다.
                                             title: container.title,	  
                                           // container에서 title, content로 받는 String값을 넣어줍니다.
                          content: container.content) else {
                            return try ResponseJSON<Empty>(status: .error,
                                                           message: "저장에 실패했습니다.")
                                                           .encode(for: req) 
                                                           // 실패할 경우 error로 리턴을 해줍니다
        }
        
        return (article
               .save(on: req) // 저장
               .flatMap({ result in  // 데이터를 반환해줄때 플랫맵으로 반환해주기 위함 입니다.
                
                return try ResponseJSON<Empty>(status: .ok,		
                                       // 값을 반환해 줄 필요는 없어 빈 data로 넘겨줍니다.
                                           message: "저장에 성공했습니다")
                                           .encode(for: req) 
            
               }))
        
    }

와 같이 create 함수를 만들어 주시면 됩니다.

 

    func boot(router: Router) throws {
        let group = router.grouped("article")
    
        // post
        group.post(ArticleContainer.self, at: "create", use: create)
        
    }

article로 묶인 group에 create라는 이름으로 ArticleContainer를 사용해 create 함수를 사용한다는 코드를 작성해주시고,

 

    curl -d '{"title":"첫 번째 게시물입니다.", "content":"Lorem ipsum dolor sit amet"}' \
    -H "Content-Type: application/json" \
    -X POST http://localhost:8080/article/create

터미널에 위와 같은 cURL명령어를 작성해주시면

와 같이 정상적으로 저장에 성공했다는 반환값을 받게 됩니다.

성공적으로 테이블에 저장된 모습을 보실수있습니다.