Ktor Client嵌套资源类中parent属性的声明必要性说明
为什么Ktor类型安全请求的嵌套资源类必须声明parent属性
这个parent属性是给Ktor Resources插件在框架内部用的路径解析元数据,根本不是设计给业务代码直接调用的,必须声明的核心原因如下:
- 首先是补全Kotlin语言特性上的引用缺失:Kotlin里不加
inner关键字的嵌套类属于静态嵌套类,和Java的非静态内部类不一样,默认不会隐式持有外部类的实例。Ktor的资源解析逻辑没法自动推断出你写在Users类内部的ById、Add是/users路径下的子资源,必须靠你显式声明一个和外部类同类型的parent属性,显式标记资源之间的父子层级关系。 - 其次是用来自动拼接完整请求路径:插件构造请求URL的时候,会递归读取parent属性对应类上的
@Resource注解配置的路径,和当前嵌套类上配置的相对路径拼在一起,生成最终的完整请求地址。拿示例里的Users.Add来说,插件读取到它的parent是Users类型,就会先把Users上配置的/users前缀拿出来,拼接上Add上配置的/add路径,再把构造参数里的name序列化为查询参数,最终得到正确的请求地址。要是没这个parent属性,插件只会拿到/add这一段相对路径,拼出来的地址少了前缀,请求直接打错路由。 - 给parent加默认值就是为了减少对业务代码的侵入:因为有默认的
Users()实例,你写业务代码构造资源对象的时候根本不需要手动传parent参数,就像示例里直接写Users.Add("new_user")就行,框架内部解析的时候会自动读取这个默认值完成路径拼接,业务层完全不用感知这个属性的存在。
要是你试过删掉这个parent属性跑请求就会发现,最后生成的请求路径会直接丢失父级的
/users前缀,根本打不到正确的接口上。
内容的提问来源于stack exchange,提问作者ino
相关产品推荐
相关产品推荐

