在JSON API中处理传入数据

我被问到的常见问题之一是如何处理来自移动或Web应用程序的不同格式的请求。

可以为JSON API提交数据的三种主要方式:

  1. 通过URL传递的数据(即http://www.example.com/api/v1/stuff?var1=myName)
  2. 作为POST请求中的表单参数
  3. 作为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,然后可以在我们的应用程序中使用和读取它。