ã»ãšãã©ã®iOSéçºè ã¯é ããæ©ããiOS SDKã®äžçã§crå±ã«ãªããŸãã ãããŠããã®çç±ã¯ãIOSãæ·±å»ãªéçºã®æ©äŒãååã«æã£ãŠããªããšããããšã§ã¯ãããŸããããææ°ã®æ·±å»ãªã¢ããªã±ãŒã·ã§ã³ã«ã¯ã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãŒããã¯ãã£ããããŸãããiOSéçºè ãå©çšã§ããã®ã¯Client Worldã ãã§ãã ãµãŒããŒéçºã¯ãã¢ãã€ã«éçºè ãAPIã®äœããå€æŽãããšããèŠä»¶ã«éåžžã«
ãããžã§ã¯ãã®äœæè ã䞻匵ãããšãããããŒãã§ã¯ã-Swiftããã°ã©ãã³ã°èšèªã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããã®ä»ã®RESTãµãŒãã¹ãäœæããéçºè ã«ãšã£ãŠçæ³çãªWebãµãŒããŒããã³ããŒã«ãããã§ãã ãçæ³ãã¯ãããã«ãããªãããšã¯æããã§ãããåæã«ãææ¡ããã解決çã«ç²ŸéããåŸããã®å£°æã«å°ãçå®ããããšããäºå®ã«åŸãå§ããŸãã
ããã¬ã¹ãã¯ãæ°ããããã°ã©ãã³ã°èšèªã®ã¢ãããŒãã«é¢ããèšäºãæ²èŒããŸãããããã¯ãã¢ããã«ã«ããç°¡åãªæåºã«ããæ¥çæšæºã«ãªãå¯èœæ§ããããŸãã 倧è¡ã«ææ ŒããSwiftã«åºã¥ãèšèªã ååãšããŠãããã«é¢ããèšäºã¯ããå€ãã®è³ªåãåŒãèµ·ããããã¹ãŠãåãã¬ãŒãã³ã°ããã®ã«ããããããŠãã人ãã¡ã«ãšã£ãŠã¯ããã«è¿·æã§ãïŒSwiftèªäœã¯éåžžã«æ¥éã«å€åããŸãïŒã ããããåé¡ã®ç 究ãæãäžããŠããã¹ãŠãèŠãããããã¯ããã«åªããŠããããšãæããã«ãªããŸããã
Perfectã¯ãæ°ãããµãŒããŒéçºèšèªã§ã¯ãããŸããã Perfectã¯ãææ°ã®å®è£ ïŒSwift 2.2ã®å·çæç¹ïŒã®Swiftã®ã¿ã䜿çšããŠREST APIãµãŒãã¹ãäœæã§ãããµãŒããŒç°å¢ã§ããã¯ã©ã€ã¢ã³ãéçºè ãæ¯æ¥ããªããã°ãªããªãããšãè¶ ãããã®ã¯ãããŸããã
ããããšïŒååºããŒãžïŒã¹ã¿ãïŒãäœæããŠããµãŒããŒã«ã¢ã¯ã»ã¹ãããšãã«ãããå®èšŒããŸãã GET / POSTãªã¯ãšã¹ãã«å¿çããREST APIãµãŒãã¹ãç°¡åã«äœæããå¯èœæ§ã瀺ããŸãã éçãªãµã€ãããŒãžã®åçãªåœ¢æã®ã¡ã«ããºã ã瀺ããŸãã ããã«ãããã¯ãã¹ãŠSwiftã§è¡ããŸãã
ã¢ã
Monoã®æ奜家ã¯ãã¯ãã¹ãã©ãããã©ãŒã ã®ãµãŒããŒéçºããŒã«ãé·ãéååšããŠãããšäž»åŒµããããšãã§ããCïŒ/ã®ãµãŒããŒåŽã«ç²ŸéããŠãã人ã«ãšã£ãŠéèŠãªãBUTãããããšç°è°ãå±ããããšã¯å°é£ã§ããå«æªæãåŒãèµ·ãããŸãã
å
責äºé
HATEOASãšHALã®äŒéè
ã¯éãéããããšãã§ããŸãã ã¢ãã€ã«éçºè
ãæ
£ããŠãã圢ã§RESTã«ã€ããŠèšåããŸãã ãã®ãããªRESTã®çŽåºŠã¯çåèŠãããå¯èœæ§ããããŸãããããããã¯ãªããªãããšã¯ãããŸããã ã¢ããªã«ãŸãŠããŸãŠãšèŠãªãããšãã§ããããã€ã³ããŸãŠã®ã¿ããŸãŠãšèŠãªãããšãã§ãããã«ã€ããŠãããªããŒãæé
ããå¿
èŠã¯ãããŸããã
ã§ããããæ ã®åºçºç¹ã¯é©åãªç°å¢ã®åµé ã§ãã æ®å¿µãªãããæ©ãç¶ããéã¯ããã»ã©æçœã§ã¯ãªããã¯ãŒã¯ã¹ããŒã¹ã®äœæããXcodeã§ã®ã¹ããŒã ã®å€æŽãŸã§ãéåžžã«å¥åŠãªæäœãæ°å€ãå«ãŸããŸãã ãããžã§ã¯ãã®äœæè ãäœæãããããªã«ãã¹ããããã€ã¹ãããã®ã¬ã€ãã瀺ãããŠããŸãã èšäºã®åã¹ãããã説æããããšã¯ãããã«ãšã£ãŠã®ã翻蚳ããšãããããã¯ã«ãããŸããã ããŒãã§ã¯ãæ©èœã®å®çšåã«çŠç¹ãåœãŠãããšæããŸããããŒãã§ã¯ãæ©èœã¯ãã³ããŒã·ã£ã«ã«ã¯ååšããªããã
HelloPerfect
ã¯ããã«ãæŠå¿µãç解ããŸãããã Perfectã¯ããµãŒããŒã©ã€ãã©ãªïŒPerfectLibïŒãšããããªã¹ãã€ã³ã¿ãŒãã§ã€ã¹ãåããã¹ã¿ãŒãã¢ããã¢ããªã±ãŒã·ã§ã³ïŒPerfect ServerïŒã®2ã€ã®éšåã§æ§æãããŠããŸãã ã©ã¡ãã®ã¢ããªã±ãŒã·ã§ã³ããªãŒãã³ãœãŒã¹ã§ãããçè«çã«ã¯ãèªåã§ããŒãºãå€æŽ/çµäºã§ããŸãã ãã ãããããè¡ãããšã¯åŒ·ããå§ãããŸããã å人çã«ãç§ã¯åžžã«äœããæ¹åããããã«å¿ã³å¯ã£ãŠããŸãã ãã ããPerfectã¯Swift 3ã§ã®äœ¿çšã«é©å¿ããŠããªãããšã«æ³šæããŠãã ãããèšèªã®äœæè ã¯ãSwift 3ãããããããŒããã ããµããŒããæããªããšèšããŸãã Swiftã®æ°ããããŒãžã§ã³ã«ã¢ããã°ã¬ãŒãããããã«ããã§ã«è¡ãããå€æŽãå®å šã«åãé€ãå¿ èŠããããŸãã
ãHello PerfectïŒãã®æ®µéã«å°éããŠããªãå Žåã¯ããããå®è¡ããæéã§ã ãå¿ èŠãªç°å¢ãããããããŠã³ããŒãã§ããŸãã ïŒãããžã§ã¯ããµã€ãã®ãªã³ã¯ã®äžéšãå£ããŠããŸãïŒ
次ã«ãindex.htmlããã³template.htmlãã¡ã€ã«ãäœæããäœæ¥ãããžã§ã¯ãã«è¿œå ããŸãã è¿œå ããåŸããã«ããã§ãŒãºã«é²ã¿ããæ°ãããã¡ã€ã«ã³ããŒãã§ãŒãºãã¹ããããè¿œå ããŸãããã
æçµçã«ããŠã£ã³ããŠã¯æ¬¡ã®ããã«ãªããŸãã
ãœãŒã¹ããã±ãŒãžindex.htmlã®ããŠã³ããŒã
<HTML> <HEAD> <TITLE>My company name.</TITLE> </HEAD> <BODY BGCOLOR="FFFFFF"> <CENTER><IMG SRC="http://www.telemis.com/sites/default/files/Cloud-Plain-Blue_2.png" width="300px"> </CENTER> <HR> <a href="http://demonsoft.net">My name</a> is a link to another nifty site <H1>This is a Header</H1> <H2>This is a Medium Header</H2> Send me mail at <a href="mailto:support@yourcompany.com"> mail@gmail.com</a>. <P> This is a new paragraph! <P> <B>This is a new paragraph!</B> <B><I>This is a new sentence without a paragraph break, in bold italics.</I></B> <HR> </BODY> </HTML>
ãœãŒã¹Template.htmlãããŠã³ããŒã
<HTML> <HEAD> <TITLE>{{TITLE}}</TITLE> </HEAD> <BODY> <table border = "1px" width="100%"> <tr> <th>{{TITLE}}</th> </tr> </table> <table border = "1px" width="100%"> <tr> <th align="left">{{BODY}}</th> </tr> </table> <table border = "0px" width="100%" > <tr> <th align="right">{{FOOTER}}</th> </tr> </table> </BODY> </HTML>
ã»ãšãã©ã®å Žåãããããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãããžã§ã¯ãããŒãžã®ãããªã§èª¬æãããŠããŸãïŒ www.youtube.com/watch?v=J441eJ40PH4ãã ãããã®ã±ãŒã¹ã§ã¯ãWebããŒãžããã¹ãããããREST APIã䜿çšã§ããŸãã ç§ãã¡ã¯äž¡æ¹ã®ããŒãºã1ã€ã®æ©äŒã«çµåããããšããŸãã
PerfectServerModuleInitã³ãŒãã次ã®ã³ãŒãã«å®å šã«çœ®ãæããŸãã
PerfectServerModuleInit
public func PerfectServerModuleInit()
{
Routing.Handler.registerGlobally()
// Root index.html page
Routing.Routes["*"] = { (_:WebResponse) in StaticFileHandler() }
// Request for static pages
Routing.Routes["GET", ["/index", "/list"]] = { (_:WebResponse) in return StaticPageHandler(staticPage: "index.html") }
// REST
Routing.Routes["GET", ["/hello"]] = { (_:WebResponse) in return HelloHandler() }
Routing.Routes["GET", ["/help"]] = { (_:WebResponse) in return HelpHandler() }
Routing.Routes["GET", ["/cars", "/car"]] = { (_:WebResponse) in return CarsJson() }
Routing.Routes["POST", ["/list"]] = { (_:WebResponse) in return CarsJson() }
}
PerfectServerModuleInitã¡ãœããã®åŒã³åºãã¯ãµãŒããŒãããžã§ã¯ãïŒç§ã®å Žåã¯MySwiftServerïŒã«ãããŸãããã©ã®ã¯ã©ã¹ã«ãé¢é£ä»ããããŠããŸããã å¥ã®.swiftãã¡ã€ã«ã«å ¥ããŸããã
PerfectServerModuleInitã¯ãWebãµãŒãã¹ãžã®ãšã³ããªãã€ã³ãã§ãã mainé¢æ°ã«äŒŒãŠããŸãã ãµãŒããŒã©ã€ãã©ãªããåŒã³åºãããã¡ãœããã åŸã§ããã§äœãèµ·ãã£ãŠããã®ãã説æããŸãã
ããã§ãããã«ããã€ãã®ã¯ã©ã¹ãè¿œå ããå¿ èŠããããŸãã
ã¯ã©ã¹hellohandler
import Foundation
import PerfectLib
class HelloHandler:RequestHandler
{
func handleRequest(request: WebRequest, response: WebResponse)
{
response.appendBodyString("Hello World!\n")
response.appendBodyString("Hello Perfect!\n")
response.appendBodyString("Hello Swift Server!\n")
response.requestCompletedCallback()
}
}
HelloHandlerã¯ã©ã¹ã¯åœ¹ã«ç«ããªããããäž»ã«ãµãŒããŒã皌åããŠããããšã確èªããããã«äœ¿çšãããŸãã ãµãŒããŒã®å¿çã¯ãåºåãããã¡ãŒã«è¡ãè¿œå ããã¯ã©ã€ã¢ã³ãïŒãã©ãŠã¶ãŒãŸãã¯ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ïŒã«ã³ãŒã«ããã¯ãè¿œå ããããšã«ãªããŸãã
ã¯ã©ã¹StaticPageHandler
import Foundation
import PerfectLib
class StaticPageHandler:RequestHandler
{
var staticPage = "index.html"
internal init(staticPage:String) {
self.staticPage = staticPage
}
func handleRequest(request: WebRequest, response: WebResponse)
{
let file = ContentPage().page(request.documentRoot, pageFile: self.staticPage)
response.appendBodyString(file)
response.requestCompletedCallback()
}
}
StaticPageHandlerã¯ã©ã¹ã䜿çšãããšãæå®ããååã§éçããŒãžããã¹ãã§ããŸãã ãããã©ã«ãã§ãindex.htmlã䜿çšãããŸãããååãšããŠããããžã§ã¯ãã«è¿œå ãããä»ã®ããŒãžã§ãããŸããŸããã
HelpHandlerã¯ã©ã¹
import Foundation
import PerfectLib
class HelpHandler:RequestHandler
{
func handleRequest(request: WebRequest, response: WebResponse)
{
let list = Routing.Routes.description.stringByReplacingString("+h", withString: "")
let html = ContentPage(title:"HELP", body:list).page(request.documentRoot)
response.appendBodyString("\(html)")
response.requestCompletedCallback()
}
}
HelpHandlerã¯ã©ã¹ã䜿çšãããšããµãŒããŒã«ãã£ãŠåŠçãããã³ãã³ãã®ãªã¹ããååŸã§ããŸãã ä»ã®ãµãŒããŒç°å¢ïŒMS Framework 4.5.1ãªã©ïŒã§ã¯ãèªå·±ææžåREST APIãµãŒããŒãååŸã§ããŸãã ããã¯ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºè ã«ãšã£ãŠéåžžã«äŸ¿å©ã§ãããµãŒããŒã®éçºè ã«ã¡ã³ããã³ã¹ãã³ãã³ãã®è¿œå ãäŸé Œããå¿ èŠã¯ãããŸããã
æŽæ°ïŒ 次ã®èšäºã§ã¯ãAPIããã¥ã¡ã³ãã®ã¡ã«ããºã ãæ¹åããŸããã
ã¯ã©ã¹CarsJson
import Foundation
import PerfectLib
class CarsJson:RequestHandler
{
func handleRequest(request: WebRequest, response: WebResponse)
{
let car1:[JSONKey: AnyObject] = ["Wheel":4, "Color":"Black"]
let car2:[JSONKey: AnyObject] = ["Wheel":3, "Color":["mixColor":0xf2f2f2]]
let cars = [car1, car2]
let restResponse = RESTResponse(data:cars)
response.appendBodyBytes(restResponse.array)
response.requestCompletedCallback()
}
}
CarsJsonã¯ã©ã¹ã¯ãGET / POSTèŠæ±ãè€éãªæ»ãæ§é ã§ã©ã®ããã«æ©èœãããã瀺ããŠããŸãã è¿ãããããŒã¿ã¯AnyObjectã«ãã£ãŠè¡šãããŸãã
ã¯ã©ã¹ContentPage
import Foundation
public class ContentPage:NSObject
{
private var title = ""
private var body = ""
private var footer = ""
public init(title:String="", body:String="", footer:String="Copyright (C) 2016 _MY_COMPANY_NAME_. All rights reserved.")
{
self.title = title
self.body = body
self.footer = footer
}
func page(webRoot:String, pageFile:String="template.html") -> String
{
let template = self.loadIndexHtml(webRoot, pageFile:pageFile)
let htmlBody = self.body.stringByReplacingString("\n", withString: "
")
var page = template
page = page.stringByReplacingString("{{TITLE}}", withString: self.title)
page = page.stringByReplacingString("{{BODY}}", withString: htmlBody)
page = page.stringByReplacingString("{{FOOTER}}", withString: self.footer)
return page
}
private func loadIndexHtml(webRoot:String, pageFile:String) -> String {
let fileManager = NSFileManager.defaultManager()
let directory = fileManager.currentDirectoryPath
let path = directory + "/\(webRoot)/\(pageFile)"
do {
return try String(contentsOfFile: path)
} catch {
print("File didn't create")
}
return "404 NOT FOUND"
}
}
éçãªããŒãžãè¿ãã察å¿ãããã£ãŒã«ãã§çœ®æãè¡ããµãŒãã¹ã¯ã©ã¹ã ããã©ã«ãã§ã¯ãtemplate.htmlãã³ãã¬ãŒãã䜿çšãããŸãããååãšããŠããããžã§ã¯ãã«è¿œå ãããä»ã®ãã³ãã¬ãŒãã䜿çšã§ããŸãã
ã¯ã©ã¹RESTResponse
import Foundation
import PerfectLib
public class RESTResponse
{
public var data:AnyObject = "" // Data from Server to Client
public var status = "" // HTTP status or other code of operation.
public var message = "" // This message Client can show in the Alert View
public var errors = [String]() // All real errors for Console
public init(data:AnyObject="", status:String="200", message:String="", errors:[String]=[])
{
self.data = data
self.status = status
self.message = message
self.errors = errors
}
public var array: [UInt8] {
let result = ["data":self.data, "status":self.status, "message":self.message, "errors":self.errors]
return serialization(result)
}
private func serialization(object:AnyObject) -> [UInt8]
{
do {
let jsonData = try NSJSONSerialization.dataWithJSONObject(object, options: NSJSONWritingOptions.PrettyPrinted)
let count = jsonData.length / sizeof(UInt8)
var jsonArray = [UInt8](count: count, repeatedValue: 0)
jsonData.getBytes(&jsonArray, length:count * sizeof(UInt8))
return jsonArray
} catch let error as NSError {
print(error)
}
return [UInt8]()
}
}
RESTResponseã¯ã©ã¹ã¯ãREST APIã䜿çšããéèŠãªã¯ã©ã¹ã§ãããæãç©è°ãããããŠããŸãã
è¿ãããããŒã¿ãªããžã§ã¯ãã«ã¯ã次ã®JSONã©ãããŒæ§é ããããŸãã
{
«data»:{âŠ. },
«errors»:[⊠],
"message":"",
"status":200
}
1ïŒäžéšã®éçºè ã¯ããã®åœ¢åŒãæ確ã«åãå ¥ããŸããã ããããè¿ãããããŒã¿ã®ãã®åœ¢åŒã«å¯Ÿãã説åŸåã®ããè°è«ã¯ãããŸããã§ããã ãã ããåä»ã圢åŒã«ã¯ç¹å®ã®å©ç¹ããããŸãã æŽå²çãªäŒçµ±ã«ããã°ããã¹ããŒã¿ã¹ããã£ãŒã«ãã®å€ã¯ãæäœãæ£åžžã«å®äºãããšã200ãã«ãªããŸãã ãã ããHTTPå¿çãšã¯çŽæ¥ã®é¢ä¿ã¯ãããŸããã ãããã¯åžžã«ãªã¯ãšã¹ãããããŒããå·®ãåŒãããšãã§ãããµãŒããŒç°å¢èªäœã«ãã£ãŠã¯ã©ã€ã¢ã³ãåŽã«éä¿¡ãããŸãã ãã¹ããŒã¿ã¹ããã£ãŒã«ãã§ã¯ãHTTPå±€ã§ã¯ãªããWebãµãŒãã¹ã®ããžãã¹ããžãã¯å ã§ã»ãã³ãã£ãã¯ããŒããæã€å€ãæž¡ãããšãã§ããŸãã ãã¡ãã»ãŒãžããã£ãŒã«ãã«ã¯ããµãŒããŒåŽã®ã¢ã¯ã·ã§ã³ãéç¥ããããã«ãŠãŒã¶ãŒã«è¡šç€ºããå¿ èŠãããæååãå«ãŸããŠããŸãã ããšãã°ãç¹ã«ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã®èŠ³ç¹ãããã¹ãŠãé 調ã«é²ãã§ããå Žåã®ã»ãã·ã§ã³ã®æå¹æéã«é¢ããæ å ±ã ããšã©ãŒãïŒ[]ãã£ãŒã«ãã¯ãç°åžžãªç¶æ³ãã¯ã©ã€ã¢ã³ãã«éç¥ããçšèªã®é åã§ãã ãã®æ å ±ãã¯ã©ã€ã¢ã³ãåŽã§ä¿åããŠåŠçããããããã«åŠçããããã«å°çšã®ãã°ãµãŒããŒã«éä¿¡ããããããšäŸ¿å©ã§ãã æåŸã«ãããŒã¿ãã£ãŒã«ãïŒ{.... }ã«ã¯è€éãªããŒã¿æ§é ãå«ãŸããŠããŸã-ã¯ã©ã€ã¢ã³ãåŽã§åä¿¡ãããããšãæ£ç¢ºã«äºæ³ããããã®ã§ãã ãã®ã¢ãããŒãã®äž»ãªå©ç¹ã¯ããµãŒããŒã®å¿çãæå®ãããã¹ããŒã ãæºãããªãå Žåãã¯ã©ã€ã¢ã³ããæ確ãªè¯å¿ãæã£ãŠæåŠã§ããããšã§ãã ãããæŽçããæ¹æ³ã«ã€ããŠã¯ã habrahabr.ru / post / 283012ãåç §ããŠãã ããã説æããã¢ãããŒãã«å察ããéçºè ã¯ããé åãããããã£ãç°¡åã«å€æŽããŠã説æããã©ãããŒãªãã§çããŒã¿ãè¿ãããšãã§ããŸãã
2ïŒPerfectéçºè ãJSONãªããžã§ã¯ããè¿ãããã«äœ¿çšããããšãææ¡ããã¢ãããŒãã«å°ã é©ããã ææ¡ããããã¥ãŒããªã¢ã«ã§ã¯ãåJSONãªããžã§ã¯ãã¯ã[JSONKeyïŒJSONValue]ïŒ[StringïŒAnyObject]ãšåçïŒã®åœ¢åŒã®ããŒ/å€ã®ãã¢ãåæããŠããªãŒãé 次æ§ç¯ããããšã«ãã圢æããããšæ³å®ãããŠããŸããã 次ã®ã³ãŒãã䜿çšããããšã«ãªã£ãŠããŸãã
public var json: String
{
let result = ["data":self.data, "status":self.status, "message":self.message, "errors":self.errors]
let jsonEncoder = JSONEncoder()
do {
let respString = try jsonEncoder.encode(result)
return respString
} catch let error as NSError {
print(error)
}
return ""
}
âŠ..
response.appendBodyString(self.json)
response.requestCompletedCallback()
ãã ãããã®ã³ãŒãã¯ãçŸåšCarsJsonã¯ã©ã¹ã«å«ãŸããŠããããŒã¿ã§ãå®å šã«åäœããŸããã ããã«ãPerfect creatorsãã¥ãŒããªã¢ã«ã®ããžãã¯ã«åŸãå Žåãè€éãªæ§é ããšã³ã³ãŒãããã«ã¯ãè¿ããããªããžã§ã¯ãããšã«ç¬èªã®ã¯ã©ã¹ãäœæããå¿ èŠããããŸãã ç§ã®ããŒãžã§ã³ã§ã¯ãæ°è¡ã®ã³ãŒãã§ä»»æã®ãã¹ãã®ãªããžã§ã¯ããã·ãªã¢ã«åã§ããããšã¯æããã§ãã ããã¯ããµãŒãã¹ã®éå§åŸã«ç¢ºèªããããšã¯é£ãããããŸããã
çºå°ïŒ
ãã¹ãŠãæ£ããè¡ããããšããã©ãŠã¶ã«æ¬¡ã®ããŒãžã衚瀺ãããŸãã
ãµãŒããŒã«æšæ¶ããïŒãã©ãŠã¶ã®è¡ã«ã/ helloããšå ¥åããŸã
å®è¡ãããã³ãã³ãã«é¢ãããµãŒããŒæ å ±ãèŠæ±ããŸãã
ãã¹ãŠã®ã³ãã³ãã¯ã«ããŽãªïŒGETãPOSTïŒã«åãããŠããããšã«æ³šæããŠãã ããã ä»ã®è¿°èªã䜿çšããå Žåããããããã®ãªã¹ãã«è¡šç€ºãããŸãã
ãã ãã/ listã³ãã³ãã¯äž¡æ¹ã®ãªã¹ãã«ããããŸãã PerfectServerModuleInitã«ãã£ãŠGETããã³POSTã³ãã³ãã«è¿œå ãããã®ã¯åœŒå¥³ã§ãããïŒïŒïŒç°ãªããã³ãã©ãŒããããŸãïŒ
ãã©ãŠã¶ã®ã³ãã³ãã©ã€ã³ãããªã¹ãã«ã¢ã¯ã»ã¹ãããšãã€ã³ããã¯ã¹ããŒãžã衚瀺ãããŸãã
ããããç¹å¥ãªã¢ããªã±ãŒã·ã§ã³ïŒããšãã°ãç¡æã®PostmanïŒã䜿çšããå ŽåãPostãªã¯ãšã¹ãã®æ¬æã«ã¯ãäºæ³ãããJSONãå«ãŸããŸãã
JSONã¯CarsJsonã¯ã©ã¹ã§çæãããæ§é ãšå®å šã«äžè²«ããŠããããšã«æ³šæããŠãã ããã
ããããGETãã/ââ listã³ãã³ããåé€ãããšã©ããªããŸãã
Routing.Routes["GET", ["/index", "/list"]] = { (_:WebResponse) in return StaticPageHandler(staticPage: "index.html") }
ååŸãããã®ïŒ
ãã®ãããªç°¡åãªæ¹æ³ã§ãéå§ããŒãžãŸãã¯ã¹ã¿ãããŒãžã眮ãæããããšã§ãRESTã³ãã³ãã®äœ¿çšãã«ãŒã«ãšããŠç°¡åã«ãã¹ã¯ã§ããŸãããããããªãŒãã³APIã䜿çšãããµãŒãã¹ã§ãªãå Žåã/ helpãªã©ã®éçºã³ãã³ãã®æåŸã«åé€ãŸãã¯ãããã¯ãããŸãã ãããããã®æ©äŒãå¥ã®æ¹æ³ã§æŽ»çšããããšãã§ããŸããGETèŠæ±ã®ã³ãã³ãã«é¢ãã詳现ãå«ãæ å ±ã衚瀺ããéçããŒãžãã³ãã©ãŒãæ©èœãããŸãã
/ carããã³/ carsã³ãã³ãã¯åãæ§é ãè¿ãããWebããŒãžãšããŠè¿ãããããšãäºæ³ãããŸãã
ããçšåºŠã®ã¹ãã«ãããã°ãREST APIãäœæããããšã¯ãå¿ èŠãªããã²ãŒã·ã§ã³ãåããViewControllerãäœæããããšã»ã©é£ãããããŸããã
ãšã¯ã¹ããªãŒã ã¹ããŒãã®ãã¡ã³ã¯ãããããã¹ãŠãLinuxã§å®è¡ããããšããããšãã§ããŸãã
æŽæ°ïŒ
ãã¥ãŒããªã¢ã«ã§JSONå¿çã®ç¥ç§çãªã·ãªã¢ã«åã䜿çšãããçç±ã«ã€ããŠã®èª¬æããããŸãã-ãã¹ãŠã®NSã¡ãœããïŒNSJSONSerializationãå«ãïŒã¯Ubuntuã§åäœãåæ¢ããŸãã