使用Hasura构建待办事项iOS应用
让我们创建另一个名为Hasura.swift
类 它将充当我们的离线存储,用于存储用户的authtoken
和hasuraId
。 这将用于检查用户是否在应用启动时登录,并验证我们随后的API调用。
注意:为了更好地了解 Hasura auth的工作方式。 请检查 文档 。
2. Embed
其Embed
UINavigationController
。 给此UINavigationController
一个Storyboard ID
“ TodoNavigationController”(此标识符在AuthorizationViewController
用于导航到TodoViewController
)
UIBarButtonItems
在TodoViewController
两个UIBarButtonItems
,一个用于注销 ,另一个用于添加ANewTodo
4.添加一个Basic
样式的Prototype Cell
带有Identifier
“ todoCell ”的UITableView
。
在为UIBarButtonItems
添加动作之后,我们的TodoViewController.swift
应该如下所示:
在上面的代码中,当用户要注销时,我们还将显示警报,而当用户要添加新的待办事项时,将显示文本字段警报,询问待办事项的标题。
接下来,让我们创建一个模型对象,该模型对象代表在todo表(我们通过Hasura控制台创建)中创建的每个条目。 让我们称之为TodoRecord
:
Hasura上的数据API通过将查询发布到以下端点来工作:
https:// data。 .hasura-app.io / v1 / query
注意:请仔细阅读 文档 以获得更好的理解。
TodoViewController需要进行5个api调用:
- 提取用户的所有待办事项:
该API如下所示:
POST 数据。 .hasura-app.io / v1 / query HTTP /1.1
内容类型:application / json
授权:Bearer
{
“ type” :“ select”,
“ args” :{
“ table” :“ todo”,
“ columns” :[“ id”,“ title”,“ completed”],
“ where” :{ “ user_id” :}
}
}
上面的查询将翻译为“ 将 todo
表中的 所有行(包含来自 id
, title
和 completed
列的数据 ) todo
,其中 user_id
是我指定的值。”
请注意,此API如何有新的标头。
Authorization: Bearer
如果未设置此标头,则该请求将不起作用。 这是因为仅允许登录的用户访问todo表中的数据。 为此,我们通过Hasura控制台将用户角色权限添加到了todo表中(向上滚动并检查只是为了慢进内存)。 此权限可确保用户A无法获取/删除/更新用户B的待办事项。 通过设置授权头,您可以让Hasura验证您的身份,即身份验证。
将此转换为我们应用的快速代码:
2.添加一个新的待办事项
POST 数据。 .hasura-app.io / v1 / query HTTP /1.1
内容类型:application / json
授权:Bearer
{
“ type” :“插入”,
“参数” :{
“ table” :“ todo”,
“对象” :[
{
“标题” :,
“ user_id” :,
“已完成” :false
}
],
“返回” :[“ id”,“标题”,“完成”]
}
}
对上述api的响应将是这样,
{
“ affected_rows” :1,
“返回” :[
{
“ id” :,
“标题” :,
“完成” :false
}
]
}
注意 returning
如何 键指定此插入请求返回的内容。 获取新插入的待办事项的ID(用于以后更新/删除待办事项)时需要使用此代码。 当在todo表中插入新行时,该id由数据库自动创建(当我们将 id
的类型设置 为 Integer-auto增量 时由我们指定 )
让我们创建一个处理此响应的类,将其TodoReturningResponse
调用看起来像:
3.更新待办事项(将其标记为已完成或取消标记)
这里的查询基本上说:“找到 todo
所有行 该表所在的 user_id
是 *Hasura.sharedInstance.hasuraId!*
,它是登录到我们应用程序的用户的ID,并且该 id
是* todoId *,它是要更新的待办事项的ID,并设置 completed
的值 为真(或假)”
4.删除待办事项
注意我们没有 returning
在发布的查询中指定的键。 因此,响应将仅包含受影响的行数。
{
“ affected_rows” :0,
}
相反,如果查询要包含returning
键…
…响应将是:
{
“ affected_rows” :1,
“返回” :[
{
“ id” :,
“标题” :,
“已完成” :
}
]
}
5.注销
让我们将所有这些放到我们的HasuraApi
类
和我们的TodoViewController
要记住的一件事是调用Hasura.sharedInstance.clearSession()
当用户注销时。 这是为了确保删除保留的数据,并在随后的应用程序启动时要求用户登录。
摘要
您可以在 github 上找到包含完整项目的存储库 。 如果您有兴趣使用 Hasura 开发Android应用程序 。 请 在此处 遵循类似的教程 。
通过这篇文章,我们使用Hasura构建了一个非常简单的todo iOS应用。 我们通过Hasura控制台在数据库中创建了一个表。 我们对Hasura用于其数据API的查询语言有了更好的了解,并将这些查询与Alamofire和ObjectMapper一起在我们的应用程序中使用。 如有疑问或有任何疑问,请随时在下面发表评论。