don't stop believing

[swift] kitura requests 기본 Parsing 하기 본문

Swift/Kitura

[swift] kitura requests 기본 Parsing 하기

Tongchun 2017. 8. 28. 10:56

Kitura를 설치했다면 기본 request에 대해 파싱해서 화면에 출력해 봅시다.

[Kitura Web Server 기본 시작하기]에 이어서 설명을 하겠습니다.


먼저 URL 경로를 이용해 데이터를 받는 방법을 확인해 봅시다.

URL 경로 다음에 ":"를 사용하고 request.parameters로 데이터를 받아올 수 있습니다.


아래 코드를 SampleRouter 구조체의 create() 함수 안에 추가합니다.

그리고 빌드하고 실행합니다.

router.get("/name/:name") { request, response, next in
    response.headers["Content-Type"] = "text/plain; charset=utf-8"
    let name = request.parameters["name"] ?? ""
    try response.send("Hello \(name)").end()
}

브라우저에서 http://localhost:8080/name/tongchun 를 호출하면 Hello tongchun 이 나오는 것을 확인할 수 있습니다. 만약 http://localhost:8080/name/ 까지만 호출한다면 경로를 모두 호출한게 아니므로 404 코드가 리턴되게 됩니다.


마찬가지로 /name/:name 뒤에 경로와 파라메터가 계속 올수 있습니다.

router.get("/name/:name/phone/:phone") { request, response, next in
    response.headers["Content-Type"] = "text/plain; charset=utf-8"
    let name = request.parameters["name"] ?? ""
    let phone = request.parameters["phone"] ?? ""
    try response.send("Hello \(name)! Is this your phone number \(phone), isn't it?").end()
}

브라우저에서 http://localhost:8080/name/tongchun/phone/0101234567 호출할 수 있습니다.


경로에 ":" 로 파라메터만을 받아올 수도 있습니다.

아래의 경우 브라우저에 http://localhost:8080/userinfo/tongchun/0101234567/korea 로 호출할 수 있습니다.

router.get("/userinfo/:name/:phone/:addr") { request, response, next in
    response.headers["Content-Type"] = "text/plain; charset=utf-8"
    let name = request.parameters["name"] ?? ""
    let phone = request.parameters["phone"] ?? ""
    let addr = request.parameters["addr"] ?? ""
    try response.send("Hello \(name)! Is this your phone number \(phone), isn't it? and your address is \(addr)").end()
}

get 방식에서 url 경로를 이용한 데이터 전달 외에도 쿼리를 이용한 데이터 전달도 확인해 봅시다.

쿼리 전달은 request.queryParameters을 사용하며 브라우저에서 ?<key>=<value>&<key>=<value>와 같은 형태로 데이터를 전달합니다. 아래 코드를 추가하고 브라우저에서 http://localhost:8080/name?name=tongchun&phone=1234059569 를 호출해 봅시다.

router.get("/name") { request, response, next in
    response.headers["Content-Type"] = "text/plain; charset=utf-8"
    let name = request.queryParameters["name"] ?? ""
    let phone = request.queryParameters["phone"] ?? ""
    try response.send("Hello \(name)! Your phone number is \(phone), isn't it?").end()
}

url 경로를 이용한 get 방식으로 데이터를 받았다면 이번엔 post 방식으로 받아봅시다.

post 방식의 body로 넘어오는 데이터를 string으로 받아봅시다. 

router.post("/plainbody/name") { request, response, next in
    response.headers["Content-Type"] = "text/plain; charset=utf-8"
    let name = try request.readString() ?? ""
    try response.send("Hello \(name)").end()
}

위 코드를 추가한 후 API 테스트 툴로 body를 전달해 본다.

나는 Chrome 확장 프로그램인 Restlet Client - REST API Testing을 사용해 테스트 했습니다.

이제 post body 데이터를 json 형식으로 받아봅시다.

먼저 json을 사용하기 위해 SwiftyJSON을 import 합니다. kitura framework 설치시 버전을 맞춘 SwiftyJSON도 자동으로 설치됩니다.

import SwiftyJSON

해당 경로에 대한 body parser를 실행합니다.

create() 함수 안에 아래 코드를 추가한다.

router.all("/jsonbody/name", middleware: BodyParser())

마지막으로 아래 코드를 추가한다.

router.post("/jsonbody/name") { request, response, next in
    response.headers["Content-Type"] = "text/plain; charset=utf-8"
    guard let parsedBody = request.body else {
        next()
        return
    }

    switch(parsedBody) {
    case .json(let jsonBody):
        let name = jsonBody["name"].string ?? ""
        try response.send("Hello \(name)").end()
    default:
        break
    }
    next()
}

REST API Testing 툴을 이용해 json 데이터를 전달해 봅니다.

리턴된 body 데이터가 Hello tongchun 이면 성공입니다.


Comments