使用Hasura构建待办事项iOS应用

让我们创建另一个名为Hasura.swift 它将充当我们的离线存储,用于存储用户的authtokenhasuraId 这将用于检查用户是否在应用启动时登录,并验证我们随后的API调用。

注意:为了更好地了解 Hasura auth的工作方式。 请检查 文档

2. EmbedEmbed UINavigationController 。 给此UINavigationController一个Storyboard ID “ TodoNavigationController”(此标识符在AuthorizationViewController用于导航到TodoViewController

UIBarButtonItemsTodoViewController两个UIBarButtonItems ,一个用于注销 ,另一个用于添加ANewTodo
4.添加一个Basic样式的Prototype Cell 带有IdentifiertodoCell ”的UITableView

在为UIBarButtonItems添加动作之后,我们的TodoViewController.swift应该如下所示:

在上面的代码中,当用户要注销时,我们还将显示警报,而当用户要添加新的待办事项时,将显示文本字段警报,询问待办事项的标题。

接下来,让我们创建一个模型对象,该模型对象代表在todo表(我们通过Hasura控制台创建)中创建的每个条目。 让我们称之为TodoRecord

Hasura上的数据API通过将查询发布到以下端点来工作:

  https:// data。 .hasura-app.io / v1 / query 

注意:请仔细阅读 文档 以获得更好的理解。

TodoViewController需要进行5个api调用:

  1. 提取用户的所有待办事项:
    该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一起在我们的应用程序中使用。 如有疑问或有任何疑问,请随时在下面发表评论。