Vapor - routes관리

2024. 3. 20. 23:05·Vapor-Server with swift

저번까지 Vapor를 다운받고 프로젝트를 생성해봤다. 그럼 이번시간에는 쪼끔 코드를 끄적끄적.....해봐야지?

routes file에 가게되면 기본적으로 이렇게 있다. 저 app.get을 통해 우리는 localhost를 통해 들어가면 it works가 뜬다. 또한 

https://127.0.0.1:8000/hello 를 get요청보내면 "hello wolrd라는 글씨가 보인다. 이렇게 그냥 string으로 작성하면 그 주소로 접근했을때의 리퀘스트에 대응할수 있다. 그렇다면 dynamic한 파라미터들이 오려고 하면 어떻게 해야할까 ? ex) movies/page/1 2 3 00.....이런식으로 

그것도 쉽다. 

    app.get("movies", ":menu") { req async throws -> String in
//        let name = req.parameters.get("name") //이렇게 하면 옵셔널 타입으로 나옴
        guard let name = req.parameters.get("menu") else {
            throw Abort(.badRequest)
        }
        return "Alllll name of genre: \(String(describing: name))"
    }

이런식으로 콤마를 붙이고 :을 붙이면 여기에는 dynmaic한 파라미터가 올수있다. 위에서 말한 page가 될수도 있고 장르가 될수도 있고 어떠한 값이 들어오면 그 뒤에 해당하는 값을  클로저안에서 처리해줄수 있다. 주소의 /가 붙을때마다 컴마로 구분해주면 된다. 그러면 정말 이제 page가 있고 그뒤에 번호들로만 들어와야할때는 어떻게 구현해줄 수 있을까? 

  app.get("movies","pages",":pageId") { req async throws -> String in
        guard let pageId = req.parameters.get("pageId", as: Int.self) else {
            throw Abort(.badRequest)
        }
        return "\(pageId)"
    }

이렇게 as파라미터가 있는 get을 사용하면된다. 이는 pageId가 Int가 아니면 badrequest 에러처리를 한다. 

근데 코드를 잘 보면 지금 다 리턴값이 String으로 나와있다. 그래서 그 주소로 갈때 그 String값이 나온다. 하지만 실제 서버통신을 할때 우리는 String으로 하는가? ㄴㄴ json형식으로 데이터를 주고받잖슴? 그러면 json으로 어떻게 하는데? 

 

Movie란 모델을 만들고 Vapor안에있는 Content 프로토콜을 채택한다. 

그렇다면 ContentProtocol은 어떻게 이루어져 있을까? 

Default로 json contenttype이 되어있고

   app.get("movies") { req async in
        [Movie(title: "봄낭ㄹ은 간다", year: 1999) , Movie(title: "good day to. ie", year: 2010)]
    }

아까 만들어논 모델로 이렇게 작성을 해준다. 그러면 어떻게 나올까 다시 런시켜보자

wow json형식이다. 

좀더 복잡한 get요청을 만들어보자 

/hotels?sort=desc&search=seoul

이런식으로 쿼리스트리이 들어간 get요청은 어떻게 할까?

app.get("hotels") { req async in 
	let sortorder:String? = req.query["sort"]
    return HTTPStatus.ok
   }
 혹은 하나의 hotelQuery모델을 만들어 거기에 sort와 string을 받아
 app.get("hotels") { req async in 
	let hotelQuerY = try req.query.decode(HotelQuery.self)
    return hotelQuerY
   }

이렇게 써주면된다. 

그렇다면 만약 hotels/모시기.모시기 이렇게 되면 점차 주소값이 길어질텐데 app.get("hotels", ...)이런식으로 써야할까? ㄴㄴ 더 줄일수 있는 법이 있다.

    let schools = app.grouped("schools")
    schools.get { req async throws -> String in
        return "schools"
    }
    schools.get(":schoolID") { req async throws -> String in
        guard let schoolId = req.parameters.get("schoolID") else {
            throw Abort(.badRequest)
        }
        return schoolId
    }

이렇게 grouped을 사용하면 저 localhost/schools를 치면 바로 schools 문자열이 나오고 아이디를 치면 해당하는 아이디가 나오게 할수 도있다. 

다양한 api요청들을 하나의 routes에서 관리하면 코드의 가독성이 떨어지므로 

struct MoviesController: RouteCollection {
    // boot는 너가 route setup을 어디서 할지를 알려주는 거임
    func boot(routes: any RoutesBuilder) throws {
        let movies = routes.grouped("movies")
        //여기까지가 /movies이거고 use에 사용할 함수를 입력해주면 된다.
        movies.get(use: index)
        movies.get(":movieId", use: show)
    }
    func index(req: Request) async throws -> String {
        return " index"
    }
    func show(req: Request) async throws -> String {
        guard let movieId = req.parameters.get("movieId") else {
            throw Abort(.internalServerError)
        }
        return "\(movieId)"
    }
}

이런식으로 Controller를 만들어주고

등록만 해주면 사용할수 있다. 

2. Post 요청

   app.post("movies") { req async throws in
        let movie = try req.content.decode(Movie.self)
        return movie
    }

이렇게 써주면 된다 .당연히 post 안의 데이터는 json형식으로 보내주어야하고!!

'Vapor-Server with swift' 카테고리의 다른 글

Vapor - middleware  (2) 2024.03.21
Vapor-Swift로 서버구축하기  (0) 2024.03.20
'Vapor-Server with swift' 카테고리의 다른 글
  • Vapor - middleware
  • Vapor-Swift로 서버구축하기
2료일
2료일
좌충우돌 모든것을 다 정리하려고 노력하는 J가 되려고 하는 세미개발자의 블로그입니다. 편하게 보고 가세요
  • 2료일
    GPT에게서 살아남기
    2료일
  • 전체
    오늘
    어제
    • 분류 전체보기 (120)
      • SWIFT개발 (29)
      • 알고리즘 (25)
      • Design (6)
      • ARkit (1)
      • 면접준비 (30)
      • UIkit (2)
      • Vapor-Server with swift (3)
      • 디자인패턴 (5)
      • 반응형프로그래밍 (12)
      • CS (3)
      • 도서관 (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
2료일
Vapor - routes관리
상단으로

티스토리툴바