在本节中,我们为您经常问我们的问题提供答案.
找不到您问题的答案? 前往#ktor Kotlin Slack频道,我们将竭诚为您服务!
目录:
io.ktor.pipeline.InvalidPhaseException: Phase Phase('YourPhase') was not registered for this pipeline
.io.ktor.server.engine.BaseApplicationResponse$ResponseAlreadySentException: Response has already been sent
Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'ktor'
exceptionHttpsRedirect
feature
kay-tor
根据内容,您可能会考虑以下几种渠道:
Rationale:
对于问题或疑难解答,我们强烈建议您使用Slack或StackOverflow.
认为使用GitHub问题会通知所有可能通过电子邮件订阅的人,进行故障排除通常需要几个问题和答案,这可能会散发大量电子邮件,也许订阅的人想知道错误,修复,新事物的介绍或提议,但也许他们对其他事物不感兴趣.
如果您有足够的时间或不想加入Slack,也可以在StackOverflow上提问. 闲聊是聊天和论坛之间的混合体,我们可以更快地相互联系,并在更短的时间内解决问题.
在进行故障排除时,如果我们确定存在错误或有待改进的地方,则可以将其报告为GitHub. 当然,将错误报告(一旦确认)仅保存在Slack中也不是一个好主意,因为它可能会被遗忘,因此请将其放到GitHub中.
拉取请求:
如果您认为值得将功能或错误修正包含在Ktor中,则可以创建PR.
请记住,我们通常会分批审查和合并PR,因此PR可能会持续几个星期. 但是,我们仍然鼓励您尽力而为!
如果您有需要立即使用的错误修正,我们建议您分叉Ktor,自己进行编译,并在自己的工件,二进制文件或类似文件中临时发布修补版本,并使用该版本直到合并并发布新版本为止(因为时间可能与您的需求不符).
CIO代表基于协程的I / O. 通常,我们将其称为使用Kotlin和Coroutines来实现实现IETF RFC或其他协议的逻辑而无需依赖于基于JVM的外部库的引擎.
确保包括ktor工件. 例如,对于gradle和Netty引擎,它将是:
dependencies { compile("io.ktor:ktor-server-netty:$ktor_version") }
- 对于gradle,请检查: https ://ktor.io/quickstart/gradle.html#engine
- 对于Maven,请检查: https : //ktor.io/quickstart/maven.html
如果您正在运行
DevelopmentEngine
/EngineMain
,它将被自动处理.否则,您将不得不手动处理它 . 您可以使用
Runtime.getRuntime().addShutdownHook
JVM的功能.
如果代理提供正确的标头并且已安装功能
XForwardedHeaderSupport
则属性call.request.origin
会提供有关原始调用方(代理)的连接信息.
如果您尝试使用位置功能而未实际安装,则会出现此错误. 检查位置功能: https : //ktor.io/features/locations.html
您可以使用jitpack从尚未发布的主版本中获取: https : //jitpack.io/#ktorio/ktor也可以从源代码构建Ktor ,并使用mavenLocal
存储库存储工件或将工件上传到自己的人工制品/托盘.
您可以使用DefaultHeaders
功能 ,该功能将发送带有Ktor版本的服务器标头. 与Server: ktor-server-core/1.0.0 ktor-server-core/1.0.0
类似Server: ktor-server-core/1.0.0 ktor-server-core/1.0.0
应该作为响应头的一部分发送.
您可以在文档网站的任何页面中使用键s (搜索), t (github文件查找器flavour)或#来访问搜索. #版本会将搜索限制在当前页面的标题部分.
在搜索中,您可以使用鼠标(或触摸设备上的手指)选择选项,也可以使用键盘上的箭头↑ ↓和返回键select进入当前所选页面.
此搜索仅使用页面标题和关键字进行搜索. 也可以在
ktor.io
域中进行Google搜索,以ktor.io
所有内容进行全文搜索.
单击折叠的长代码片段,可以通过单击始终出现在移动设备左上角的
'+'
/'-'
符号或使用鼠标悬停在设备上'-'
符号来展开. 您也可以双击片段以将其展开. 除了扩展它之外,此操作还将选择文本,因此您可以使用Mac上的cmd + c或其他操作系统上的ctrl + c轻松复制片段.
您可以单击标题和一些注释,以获得指向各部分的锚定链接. 单击后,您可以在浏览器中复制新的URL,包括
#
以链接到该页面中的特定部分.
Ktor为路由功能提供了一种跟踪机制,以帮助对路由决策进行故障排除. 检查"路由"页面中的" 跟踪路由决策"部分.
io.ktor.pipeline.InvalidPhaseException: Phase Phase('YourPhase') was not registered for this pipeline
.这意味着您正在尝试使用未注册为另一阶段的参考的阶段. 例如,如果您尝试在一个节点内注册一个相位关系,但是在另一个祖先Route节点中定义了引用的相位,则可能在"路由"功能中发生这种情况. 由于路由阶段和拦截器后来合并,因此它应该可以工作,但是您需要在Route节点中注册它:
route.addPhase(PhaseDefinedInAncestor)
route.insertPhaseAfter(PhaseDefinedInAncestor, MyNodePhase)
io.ktor.server.engine.BaseApplicationResponse$ResponseAlreadySentException: Response has already been sent
这意味着您或功能或拦截器已经调用过call.respond*
函数,并且您将再次调用它.
有一页说明了Ktor的应用程序级事件系统 .
Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'ktor'
exception 这意味着Ktor无法找到application.conf
文件. 重新检查它是否在resources
文件夹中,并且资源文件夹已被标记为这样. 您可以考虑使用项目生成器或IntelliJ插件来设置项目,以将工作项目作为基础.
已知Ktor可在Android 7或更高版本(API 24)上运行. 在Android 5等较低版本中它将失败.
在不受支持的版本中,它将失败,并出现类似以下的异常:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mypackage.example, PID: 4028 java.lang.NoClassDefFoundError:
io.ktor.application.ApplicationEvents$subscribe$1 at io.ktor.application.ApplicationEvents.subscribe(ApplicationEvents.kt:18) at
io.ktor.server.engine.BaseApplicationEngine.<init>(BaseApplicationEngine.kt:29) at
io.ktor.server.engine.BaseApplicationEngine.<init>(BaseApplicationEngine.kt:15) at
io.ktor.server.netty.NettyApplicationEngine.<init>(NettyApplicationEngine.kt:17) at io.ktor.server.netty.Netty.create(Embedded.kt:10) at
io.ktor.server.netty.Netty.create(Embedded.kt:8) at io.ktor.server.engine.EmbeddedServerKt.embeddedServer(EmbeddedServer.kt:50) at
io.ktor.server.engine.EmbeddedServerKt.embeddedServer(EmbeddedServer.kt:40) at
io.ktor.server.engine.EmbeddedServerKt.embeddedServer$default(EmbeddedServer.kt:27)
有关更多信息,请查看问题#495和StackOverflow问题
CURL -I
是执行HEAD
请求的CURL --head
的别名. 默认情况下,Ktor不处理GET
处理程序的HEAD
请求,因此您可能会得到类似以下内容的信息:
curl -I http://localhost:8080
HTTP/1.1 404 Not Found
Content-Length: 0
for:
routing {
get("/") { call.respondText("HELLO") }
}
Ktor可以自动处理HEAD
请求,但要求您首先安装AutoHeadResponse
功能 .
install(AutoHeadResponse)
HttpsRedirect
feature最可能的原因是您的后端位于反向代理或负载平衡器的后面,并且该中介正在向您的后端发出正常的HTTP请求,因此您的Ktor后端内部的HttpsRedirect功能认为这是一个正常的HTTP请求并响应与重定向.
通常,反向代理会发送一些描述原始请求的标头(例如HTTPS或原始IP地址),并且具有XForwardedHeaderSupport
功能来解析这些标头,因此HttpsRedirect
功能可以知道原始请求是HTTPS.