Ktor和GraphQL_ktor 创建,移动端页面开发框架是什么

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

return players

}

override fun filterPlayersByPosition(position: Position):List {
return players.filter { it.position == position }
}

override fun filterPlayersByTeam(team: String): List {
return players.filter { it.team == team }
}

override fun updatePlayer(uid: String, playerInput: PlayerInput) {
players.find { it.uid == uid }?.apply {
name = playerInput.name
position = playerInput.position
team = playerInput.team
}
}
}


现在,您使用的是来自玩家列表的内置数据。因此,您要实现的操作将来自这个本地列表。现在您已经拥有了使用GraphQL公开数据所需的所有类。  
 使用GraphQL的Ktor客户端  
 在对象模型和模型接口完成后,您将集中精力包装GraphQL的接口。具体来说,您将使用KGraphQL包装您的接口。KGraphQL是GraphQL的Kotlin实现。它提供了一个丰富的DSL来设置GraphQL模式。首先定义模式。


### 创建架构


GraphQL服务器使用模式来描述数据图的形状。此架构定义了一个类型层次结构,其中包含从后端数据存储填充的字段。该模式还精确地指定哪些查询和变异可供客户机针对数据图执行。从创建 图表.kt文件src公司目录并添加:



import com.apurebase.kgraphql.schema.dsl.SchemaBuilder
import com.raywenderlich.kgraphqlfootball.models.Player
import com.raywenderlich.kgraphqlfootball.models.PlayerInput
import com.raywenderlich.kgraphqlfootball.models.Position
import com.raywenderlich.kgraphqlfootball.respository.IPlayerRepository
import com.raywenderlich.kgraphqlfootball.respository.PlayerRepository

fun SchemaBuilder.schemaValue() {
// 1
val repository: IPlayerRepository = PlayerRepository()

// TODO: Queries and mutations will go here …

// 2
inputType{
description = “The input of the player without the identifier”
}
// 3
type{
description = “Player object with the attributes name, team, position and identifier”
}
// 4
enum()
}


在上面的代码中,您必须定义下列步骤:


为上一节中实现的玩家定义存储库。  
 这个inputType用作GraphQL模式上输入数据模型的对象类型。  
 将Kotlin数据类注册到type方法将其包含在已创建的架构类型系统中。  
 将Kotlin枚举注册到enum方法将其包含在已创建的架构类型系统中。  
 如果您在IntelliJ中重新启动服务器并刷新浏览器,您应该会注意到最右边的Schema选项卡。如果你点击它,你会看到你的模型描述在面板显示。  
 你会注意到description您在描述您的模型时填充也显示在这里。这对于那些可能使用您的接口来更好地理解端点提供的模型的开发人员非常有用。


使用模式中定义的数据类型,下一步将添加第一个查询。


### 使用查询获取数据


GraphQL查询只是从数据存储中读取或获取值。这些查询有助于减少数据的过度获取。与restapi不同,GraphQL允许用户选择从服务器获取哪些字段。这意味着更小的查询和更少的网络流量,减少了响应时间。


首先,您将添加一个方法来按给定位置查询:



// 1 query(“playersByPosition”) { // 2 description = “Retrieve all the players by his position” // 3 resolver { position: Position -> try { // 4 repository.filterPlayersByPosition(position) } catch (e: Exception) { emptyList() } } }


在GraphQL中,每个属性都需要一个解析器。解析器是系统逻辑的一部分,需要解析响应图。自从你定义Position枚举类型,您可以接受它作为解析器的一部分。最后一步是在启动应用程序时设置模式。


打开应用.kt并将“Hello,world”查询替换为:



schema { schemaValue() }


要测试实现,请尝试运行playerByPosition查询。在查询部分,添加:



查询fetchplayerbyposition(KaTeX parse error: Expected '}', got 'EOF' at end of input: …ition(position:position){uid name position团队}


单击查询变量选项卡,并将以下表示对象的代码放在参数字段中。在这里,您选择搜索中场球员。



{
“position”: “MID”
}


单击中间部分播放按钮。  
 为了充实API,添加以下内容players和 球员队查询以检索所有玩家的列表,并按团队分别检索玩家。



query(“players”) {
description = “Retrieve all players”
resolver { ->
try {
repository.listPlayers()
} catch (e: Exception) {
emptyList()
}
}
}

query(“playersByTeam”) {
description = “Retrieve all the players by his team”
resolver { team: String ->
try {
repository.filterPlayersByTeam(team)
} catch (e: Exception) {
emptyList()
}
}
}


### 写入带有突变的数据


在REST中,任何请求都可能对服务器造成副作用。但按照惯例,建议不要使用GET请求来修改数据。GraphQL类似-任何查询都不应该执行数据写入。但是,建立一个约定,即任何导致写操作的操作都应该通过突变 .


首先要添加一个突变,以允许创建新的玩家。



// 1
mutation(“createPlayer”) {
// 2
description = “Create a new player”
// 3
resolver { playerInput: PlayerInput ->
try {
// 4
val uid = java.util.UUID.randomUUID().toString()
val player = Player(uid, playerInput.name, playerInput.team, playerInput.position)
repository.createPlayer(player)
true
} catch (e: Exception) {
false
}
}
}


以上代码分解如下:


1、创建mutation有一个独特的名字  
 2、对该方法进行描述,以帮助开发人员更好地理解该方法。  
 3、使用resolver接受播放器输入。请记住,您先前使用架构定义了此类,因此可以使用类型化输入。  
 4、创建Player对象,并将其存储在列表中。  
 与查询一样,您将为您创建的每个解析器调用相应的存储库方法。


在查询变量,将表示对象的以下代码放在参数字段中:



{
“playerInput”: {
“name”: “Test player”,
“position”: “DEF”,
“team”: “Barcelona”
}
}


执行此操作时,请在操场上获得以下结果:  
 ![](https://img-blog.csdnimg.cn/933d5ae263ab4922854f5f6670635873.png)




数字段中:



{
“playerInput”: {
“name”: “Test player”,
“position”: “DEF”,
“team”: “Barcelona”
}
}


执行此操作时,请在操场上获得以下结果:  
 ![](https://img-blog.csdnimg.cn/933d5ae263ab4922854f5f6670635873.png)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值