Frequently Asked Questions

预计阅读时间:8分钟

在本节中,我们为您经常问我们的问题提供答案.

找不到您问题的答案? 前往#ktor Kotlin Slack频道,我们将竭诚为您服务!

目录:

What is the proper way to pronounce ktor?

kay-tor

How do I put questions, report bugs, contact you, contribute, give feedback, etc.?

根据内容,您可能会考虑以下几种渠道:

  • GitHub: Feature request, change suggestions/proposals, bugs and PRs.
  • 松弛:问题,故障排除,指导等.
  • StackOverflow: Questions.

Rationale:

对于问题或疑难解答,我们强烈建议您使用Slack或StackOverflow.

认为使用GitHub问题会通知所有可能通过电子邮件订阅的人,进行故障排除通常需要几个问题和答案,这可能会散发大量电子邮件,也许订阅的人想知道错误,修复,新事物的介绍或提议,但也许他们对其他事物不感兴趣.

如果您有足够的时间或不想加入Slack,也可以在StackOverflow上提问. 闲聊是聊天和论坛之间的混合体,我们可以更快地相互联系,并在更短的时间内解决问题.

在进行故障排除时,如果我们确定存在错误或有待改进的地方,则可以将其报告为GitHub. 当然,将错误报告(一旦确认)仅保存在Slack中也不是一个好主意,因为它可能会被遗忘,因此请将其放到GitHub中.

拉取请求:

如果您认为值得将功能或错误修正包含在Ktor中,则可以创建PR.

请记住,我们通常会分批审查和合并PR,因此PR可能会持续几个星期. 但是,我们仍然鼓励您尽力而为!

如果您有需要立即使用的错误修正,我们建议您分叉Ktor,自己进行编译,并在自己的工件,二进制文件或类似文件中临时发布修补版本,并使用该版本直到合并并发布新版本为止(因为时间可能与您的需求不符).

What does CIO mean?

CIO代表基于协程的I / O. 通常,我们将其称为使用Kotlin和Coroutines来实现实现IETF RFC或其他协议的逻辑而无需依赖于基于JVM的外部库的引擎.

Ktor imports are not being resolved. Imports are in red.

确保包括ktor工件. 例如,对于gradle和Netty引擎,它将是:

dependencies {
    compile("io.ktor:ktor-server-netty:$ktor_version")
}

Does ktor provide a way to catch IPC signals (e.g. SIGTERM or SIGINT) so the server shutdown can be handled gracefully?

如果您正在运行DevelopmentEngine / EngineMain ,它将被自动处理.

否则,您将不得不手动处理它 . 您可以使用Runtime.getRuntime().addShutdownHook JVM的功能.

How do I get the client IP behind a proxy?

如果代理提供正确的标头并且已安装功能XForwardedHeaderSupport则属性call.request.origin会提供有关原始调用方(代理)的连接信息.

I get the error ‘java.lang.IllegalStateException: No instance for key AttributeKey: Locations’

如果您尝试使用位置功能而未实际安装,则会出现此错误. 检查位置功能: https : //ktor.io/features/locations.html

How can I test the latest commits on master?

您可以使用jitpack从尚未发布的主版本中获取: https : //jitpack.io/#ktorio/ktor也可以从源代码构建Ktor ,并使用mavenLocal存储库存储工件或将工件上传到自己的人工制品/托盘.

How can I be sure of which version of Ktor am I using?

您可以使用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应该作为响应头的一部分发送.

Website accessibility tips and tricks

您可以在文档网站的任何页面中使用键s (搜索), t (github文件查找器flavour)或来访问搜索. 版本会将搜索限制在当前页面的标题部分.

在搜索中,您可以使用鼠标(或触摸设备上的手指)选择选项,也可以使用键盘上的箭头 和返回键select进入当前所选页面.

此搜索仅使用页面标题和关键字进行搜索. 也可以在ktor.io域中进行Google搜索,以ktor.io所有内容进行全文搜索.

单击折叠的长代码片段,可以通过单击始终出现在移动设备左上角的'+' / '-'符号或使用鼠标悬停在设备上'-'符号来展开. 您也可以双击片段以将其展​​开. 除了扩展它之外,此操作还将选择文本,因此您可以使用Mac上的cmd + c或其他操作系统上的ctrl + c轻松复制片段.

您可以单击标题和一些注释,以获得指向各部分的锚定链接. 单击后,您可以在浏览器中复制新的URL,包括#以链接到该页面中的特定部分.

My route is not being executed, how can I debug it?

Ktor为路由功能提供了一种跟踪机制,以帮助对路由决策进行故障排除. 检查"路由"页面中的" 跟踪路由决策"部分.

I get a io.ktor.pipeline.InvalidPhaseException: Phase Phase('YourPhase') was not registered for this pipeline.

这意味着您正在尝试使用未注册为另一阶段的参考的阶段. 例如,如果您尝试在一个节点内注册一个相位关系,但是在另一个祖先Route节点中定义了引用的相位,则可能在"路由"功能中发生这种情况. 由于路由阶段和拦截器后来合并,因此它应该可以工作,但是您需要在Route节点中注册它:

route.addPhase(PhaseDefinedInAncestor)
route.insertPhaseAfter(PhaseDefinedInAncestor, MyNodePhase)

I get a io.ktor.server.engine.BaseApplicationResponse$ResponseAlreadySentException: Response has already been sent

这意味着您或功能或拦截器已经调用过call.respond*函数,并且您将再次调用它.

How can I subscribe to Ktor events?

有一页说明了Ktor的应用程序级事件系统 .

I get a Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'ktor' exception

这意味着Ktor无法找到application.conf文件. 重新检查它是否在resources文件夹中,并且资源文件夹已被标记为这样. 您可以考虑使用项目生成器IntelliJ插件来设置项目,以将工作项目作为基础.

Can I use ktor on Android?

已知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)

有关更多信息,请查看问题#495StackOverflow问题

CURL -I returns a 404 Not Found

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) 

I get an infinite redirect when using the HttpsRedirect feature

最可能的原因是您的后端位于反向代理或负载平衡器的后面,并且该中介正在向您的后端发出正常的HTTP请求,因此您的Ktor后端内部的HttpsRedirect功能认为这是一个正常的HTTP请求并响应与重定向.

通常,反向代理会发送一些描述原始请求的标头(例如HTTPS或原始IP地址),并且具有XForwardedHeaderSupport功能来解析这些标头,因此HttpsRedirect功能可以知道原始请求是HTTPS.

by  ICOPY.SITE