在JSON API中处理传入数据
我被问到的常见问题之一是如何处理来自移动或Web应用程序的不同格式的请求。
可以为JSON API提交数据的三种主要方式:
- 通过URL传递的数据(即http://www.example.com/api/v1/stuff?var1=myName)
- 作为POST请求中的表单参数
- 作为JSON提交的POST,PATCH或PUT请求的主体。
因此,我将从“完美应用程序模板”的一个简单实例开始:
$ git clone https://github.com/PerfectlySoft/PerfectAppTemplate.git jsontest
$ cd jsontest
$ swift包generate-xcodeproj
这将创建一个Xcode项目…打开它,然后打开“ Sources-> Perfect-App-Template-> configuration-> Routes.swift”
在第29行,有一条GET请求的路由,URI为“ /”
如果我们现在按原样运行此项目,则它将构建应用程序并运行它。
要运行:从“方案”下拉列表中选择可执行目标,然后运行(CMD-R)。 然后,在浏览器中访问http:// localhost:8181-您将看到“ Hello,World!”
JSON路由和Postman测试
尽管我们可以使用浏览器轻松测试GET路由,但对于其他请求类型(如POST)却并非如此简单。 这是诸如Postman之类的工具介入的地方-这使我们能够通过各种选项模拟不同类型的请求。
JSON GET路线
我们需要添加的两件事是路由,以及该路由的处理程序。
路线:
route.append([[“ method”:“ get”,“ uri”:“ / api / v1 / test”,“ handler”:Handlers.JSONtestGET])
这指向新的路由Handlers.JSONtestGET ,我们需要创建它:
静态函数JSONtestGET(data:[String:Any])抛出-> RequestHandler {
返回{
请求,回应
做{
尝试response.setBody(json:[“ message”:“你好,世界!,这是一个GET请求”])
} {
打印(错误)
}
response.completed()
}
}
所有这些操作就是回显一个简单的“ Hello,World !,这是一个GET请求”。
JSON POST路线
接下来,我们将演示如何基于HTTP动词将相同的路由定向到不同的处理程序。 与GET请求类似,我们需要添加路由和处理程序。
路线:
route.append([[“ method”:“ post”,“ uri”:“ / api / v1 / test”,“ handler”:Handlers.JSONtestPOST])
现在, JSONtestPOST函数:
静态函数JSONtestPOST(data:[String:Any])抛出-> RequestHandler {
返回{
请求,回应
做{
尝试response.setBody(json:[“ message”:“你好,世界!这是一个POST请求”])
} {
打印(错误)
}
response.completed()
}
}
请注意,这是一个零交互的基本路由,它的行为几乎和我们之前看过的GET请求完全一样。
现在,让我们设置一个POST路由来读取URL变量并将其回显。
另一个JSON POST路由,具有URL交互
与之前一样,让我们先创建一条路线,然后创建一个处理程序:
route.append([[“ method”:“ post”,“ uri”:“ / api / v1 / testparam”,“ handler”:Handlers.JSONtestPOSTvarURL])
和处理程序:
静态函数JSONtestPOSTvarURL(data:[String:Any])抛出-> RequestHandler {
返回{
请求,回应
做{
如果让name = request.param(name:“ name”){
尝试response.setBody(json:[“ message”:“你好,\(name)!”])
}其他{
尝试response.setBody(json:[“ message”:“您好,世界!如果您允许我可以个性化此设置?”])
}
} {
打印(错误)
}
response.completed()
}
}
这里真的只有一件事:
“ if let name = request.param(name:“ name”)”为我们提供了是否存在名为“ name”的参数的切换,并在回显响应时使用它。
因此,在Postman中,我们可以构建POST路由并使用URL变量提交:
我们还可以看到没有参数时会发生什么:
读取表单参数的POST路线
打破模式,我不会介绍新的路线或处理程序…
相反,在Postman中,我们将构造POST参数:
因此,您会看到, “ request.param(name:“ name”)”将同时获取之前的GET(查询)参数和POST参数。
最后,一个POST请求读取请求主体中的JSON
在API上下文中提交信息的最佳方法实际上是在请求正文中提交JSON。
这次我们确实需要新的路线和处理程序:
route.append([[“ method”:“ post”,“ uri”:“ / api / v1 / testbody”,“ handler”:Handlers.JSONtestPOSTbody])
新的处理程序“ Handlers.JSONtestPOSTbody” :
静态函数JSONtestPOSTbody(data:[String:Any])抛出-> RequestHandler {
返回{
请求,回应
做{
如果让正文= request.postBodyString {
让json =试试body.jsonDecode()为? [String:Any]
让name = json?[“ name”]为? 字符串?? “未定义”
尝试response.setBody(json:[“ message”:“你好,\(name)!”])
}其他{
尝试response.setBody(json:[“ message”:“您好,世界!如果您允许我可以个性化此设置?”])
}
} {
打印(错误)
}
response.completed()
}
}
因此,与最后一个处理程序的不同之处在于:
- 我们引入了“ request.postBodyString” ,它使我们能够访问发布的JSON正文。
- 接下来,我们将其解码( 让json =试试body.jsonDecode()为[String:Any] )
- 然后,我们可以访问以JSON提交的名称/值对:
let name = json?[“ name”] as? 字符串?? “未定义” - 最后,我们可以使用这些属性。
通过使用Postman进行操作,我们可以看到可以提交标准化的JSON,然后可以在我们的应用程序中使用和读取它。