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() 함수 안에 추가합니다.

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

1
2
3
4
5
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()
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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


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

1
2
3
4
5
6
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()
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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


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

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

1
2
3
4
5
6
7
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()
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

1
2
3
4
5
6
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()
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

1
2
3
4
5
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()
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

1
import SwiftyJSON
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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


Comments