具有Kitura编码路由的服务器端Swift CRUD API

Kitura是IBM创建的服务器端Swift Web框架。 它已获得MIT许可,免费使用,并且源代码是开放源代码。 最近,随着2.0版本的发布,Kitura团队引入了新的Codable Routes功能,这使开发人员可以非常轻松地使用Swift 4 Codable自动处理URL请求和响应。

Swift 4引入了Codable协议,这意味着实现Codable协议的类型能够将其属性解码和编码为任何外部表示形式,例如JSON。 在语言级别上,许多原始数据类型(例如Int,String,Double,Data,URL)已经是Codable类型,包含Codable类型的Array和Dictionary也已经是Codable类型。

  struct TodoItem:可编码{ 
var id:字符串
var标题:字符串
var内容:字符串
} //将TodoItem结构编码为JSON数据
让todoItem = TodoItem(id:“ 1”,标题:“ hello”,内容:“ world”)
让jsonData =试试! JSONEncoder.encode(todoItem)//将JSON数据解码为TodoItem结构
让todoItem2 =试试! JSONDecoder.decode(TodoItem.self,来自:jsonData)

使用内置的JSONEncoder和JSONDecoder类的Swift,从JSON编码和解码可编码对象,反之亦然。 使用Codable,我们不必手动解析JSON或使用第三方库(如SwiftyJSON)进行解析。 可编码的工作就像魔术一样。

使用Kitura Codable Routes,我们可以创建一个Router终结点方法,该方法接受请求的Codable对象,并将完成闭合传递给该Codable对象作为响应。 作为开发人员,我们不再需要手动编写编码和解码逻辑。 要查看所有这些操作,让我们使用内存数据存储区为TodoItem构建一个CRUD API。

 进口Kitura 
导入KituraContractsstruct TodoItem:可编码{
var id:字符串
var标题:字符串
var detail:字符串
} var todos = [
TodoItem(id:“ 1”,标题:“清理房子”,详细信息:“我的房子”),
TodoItem(id:“ 2”,标题:“洗车”,详细信息:“您的私人车”)] let router = Router()

检索TodoItem的列表

我们可以使用路由器的GET方法检索TodoItem的列表,并指定/ todos作为路径。 然后,将闭包传递给处理程序参数,该参数本身具有针对TodoItem和RequestError的可选Array的完成闭包。 在这种简单的情况下,我们只需调用完成函数就可以将内存中的todos TodoItem Array传递给我们。 如果需要,我们可以使用自己的数据库来检索和存储TodoItem,但为简单起见,我们仅在内存存储中使用。

  router.get(“ / todos”,handler:{(完成:@转义([TodoItem] ?, RequestError?)->无效) 
完成(待办事项,无)
})

您可以从终端使用cURL命令测试请求。 它应该返回已经编码为JSON表示形式的TodoItem列表。

  curl -X GET本地主机:8090 / todos 

检索单个TodoItem

要检索单个ToDoItem,我们需要添加其他参数id(它是一个String),并将完成关闭参数更改为可选的TodoItem。 我们检查传递的id是否属于我们的todos数组中的TodoItem之一。 如果是,则调用传递TodoItem对象的完成,否则,则传递RequestError.notFound错误。

  router.get(“ / todos”){(id:字符串,完成:@转义(TodoItem ?, RequestError?)->无效)在 
让todo = todos.first {$ 0.id.contains(id)}
如果让todo = todo {
完成(待办事项,无)
}其他{
完成(无,RequestError.notFound)
}
}

为了测试检索单个TodoItem,我们需要将id附加为URL的最后一个路径部分。

  curl -X GET本地主机:8090 / todos / 1 

创建TodoItem

要创建项目,我们使用POST方法和/ todos / create作为路径。 我们需要添加TodoItem作为处理程序关闭的参数。 如果成功创建TodoItem,则完成将返回TodoItem;如果发生错误,则完成将返回RequestError。 在函数内部,我们检查传递的TodoItem ID是否在内存数组中。 如果没有,我们只是将其附加到数组,然后调用传递TodoItem的完成关闭。

  router.post(“ / todos / create”){(todo:TodoItem,完成:(TodoItem ?, RequestError?)->无效)在 
让currentTodoIndex = todos.index {$ 0.id.contains(todo.id)}
如果currentTodoIndex!= nil {
完成(无,RequestError.conflict)
}其他{
todos.append(todo)
完成(待办事项,无)
}
}

为了测试创建TodoItem,我们可以使用curl命令,将Header设置为接受JSON并在请求主体中发送JSON数据。

  curl -X POST本地主机:8090 / todos / create \ 
-H“ Content-Type:应用程序/ json” \
-d'{
“ id”:“ 56789”,
“ title”:“你好”,
“ detail”:“ world”,
}'

删除TodoItem

要删除TodoItem,我们添加id类型为String的id参数,并在删除失败或未通过传递的id找到TodoItem的情况下完成可选RequestError的完成。 在函数内部,我们仅使用id查找与传递的id匹配的当前TodoItem索引。 如果找到,我们只删除该索引处的TodoItem。

  router.delete(“ / todos”){(id:字符串,完成:(RequestError?)->无效)在 
让currentTodoIndex = todos.index {$ 0.id.contains(id)}
如果让currentTodoIndex = currentTodoIndex {
todos.remove(at:currentTodoIndex)
完成(无)
}其他{
完成(RequestError.notFound)
}
}

这是curl命令,用于删除TodoItem。

  curl -X删除本地主机:8090 / todos / 1 

这是完整的源代码。