标签: ktor

在 Ktor 中,如何将 InputStream 流式传输到 HttpClient 请求的主体中?

我正在使用Ktor 1.2.2,并且有一个 InputStream 对象,我想将其用作我接下来发出的 HttpClient 请求的主体。直到 Ktor 0.95 为止,这个InputStreamContent对象似乎就是这样做的,但它已在版本 1.0.0 中从 Ktor 中删除(遗憾的是无法弄清楚原因)。

我可以使用 ByteArrayContent 使其工作(请参见下面的代码),但我宁愿找到一个不需要将整个 InputStream 加载到内存中的解决方案......

ByteArrayContent(input.readAllBytes())
Run Code Online (Sandbox Code Playgroud)

此代码是一个简单的测试用例,模拟我想要实现的目标:

val file = File("c:\\tmp\\foo.pdf")
val inputStream = file.inputStream()
val client = HttpClient(CIO)
client.call(url) {
      method = HttpMethod.Post
      body = inputStream // TODO: Make this work :(
    }
// [... other code that uses the response below]
Run Code Online (Sandbox Code Playgroud)

如果我遗漏了任何相关信息,请告诉我,

谢谢!

kotlin ktor ktor-client

8
推荐指数
2
解决办法
6331
查看次数

Ktor http 客户端 - 请求进度

如何监控 Ktor http 客户端中的请求进度?

例如:我有这样的请求:

val response = HttpClient().get<String>("https://stackoverflow.com/")
Run Code Online (Sandbox Code Playgroud)

我想用进度条监控请求进度,如下所示:

fun progress(downloaded: Long, contentLength: Long) {
    // Update progress bar or whatever
}
Run Code Online (Sandbox Code Playgroud)

如何设置progress()由HttpClient调用?

编辑:这是 Kotlin 多平台项目。相关依赖有:

implementation 'io.ktor:ktor-client-core:1.2.5'
implementation 'io.ktor:ktor-client-cio:1.2.5'
Run Code Online (Sandbox Code Playgroud)

kotlin ktor

8
推荐指数
1
解决办法
2410
查看次数

如何在 Ktor 微服务应用中安排任务

我正在尝试在我的 Ktor 应用程序中安排一项任务,但是我无法在网上找到有关如何执行此操作的任何信息。有没有人有任何建议或以前能够做到这一点?

scheduling kotlin ktor

8
推荐指数
1
解决办法
1604
查看次数

如何在 Ktor 中散列和验证密码?

我是 Kotlin 和 Ktor 的新手,当我尝试为我的 Web 应用程序实现身份验证时,我需要存储用户的密码。但是,我似乎无法通过 Ktor Core 或外部 java 依赖项找到一种方法来哈希密码并验证它们。

我发现了一些关于如何使用 BCrypt 或 PBKDF2 进行散列的文章,但这些文章要求我自己进行散列实现,这似乎不安全,因为我将不得不担心维护它。

  • 有没有办法通过 Ktor 来哈希密码并验证它们?(类似于 PHP 的password_hash()password_verify()
  • 如果没有,您能推荐一个声誉良好且维护良好的 Gradle 依赖项吗?
  • 或者我如何进行自定义实现并确保其安全?

java password-hash gradle kotlin ktor

8
推荐指数
1
解决办法
8410
查看次数

Ktor - 我生成了一个新项目来尝试一下,但无法导入 CIO 引擎

我正在为一个项目尝试 Ktor,但 Ktor 插件生成的示例项目不起作用。CIO 引擎导入存在问题。

当我输入import io.ktor.client.engine.cio.*“未解析参考:cio”时

这是我的build.gradle

buildscript {
    ext.kotlin_version = '1.4.10'
    ext.ktor_version = '1.4.0'

    repositories {
        jcenter()
    }
    
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'
apply plugin: 'application'

sourceCompatibility = 1.8
compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

kotlin {
    experimental {
        coroutines "enable"
    }
}

group 'com.archilog_rest'
version '0.0.1'
mainClassName = "io.ktor.server.tomcat.EngineMain"

sourceSets {
    main.kotlin.srcDirs = main.java.srcDirs = ['src']
    test.kotlin.srcDirs = test.java.srcDirs = ['test']
    main.resources.srcDirs = …
Run Code Online (Sandbox Code Playgroud)

kotlin build.gradle ktor

8
推荐指数
1
解决办法
1465
查看次数

Kotlin:Ktor 如何将文本响应为 html

我想使用库kotlin-html来生成 html 而不是 kotlinx.html。这个库只生成一个 html 文本:

p("A paragraph").render()
// => <p>A paragraph</p>
Run Code Online (Sandbox Code Playgroud)

但我找不到如何使用 Ktor 响应 html 而不是文本

fun Routing.root() {
    get("/") {
        call.respondText {"<p>A paragraph</p>"}
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码将生成一个包含文本的页面,<p>A paragraph</p>而不是 html 页面。而且似乎call.respondHtml只适用于 kotlinx.html DSL。我怎样才能使用纯文本来做到这一点?

kotlin ktor

7
推荐指数
1
解决办法
3724
查看次数

Ktor:如何验证 JSON 请求?

我已经知道如何接收 JSON 对象并自动将其反序列化为所需的格式(例如,使用数据类)。另请参阅如何在 Ktor 中接收 JSON 对象?

我现在的问题是我想验证 JSON 请求,BadRequest如果它不是所需的格式,则返回,类似于 Django:https : //stackoverflow.com/a/44085405/5005715

我怎样才能在 Ktor/Kotlin 中做到这一点?不幸的是,我在文档中找不到解决方案。此外,必填/可选字段会很好。

json kotlin ktor

7
推荐指数
2
解决办法
5171
查看次数

如何检测 ktor 服务器上的客户端是否取消了请求

我在服务器上使用 ktor 并有一个可能执行很长时间(一分钟或更长时间)的请求。我想检测客户端请求取消以释放资源并取消长时间运行的操作。有什么办法可以做到吗?

提前致谢

kotlin server ktor

7
推荐指数
0
解决办法
433
查看次数

ktor android本地http服务器抛出错误

我做了什么?

  1. 添加了依赖项下build.gradle
implementation "io.ktor:ktor:1.3.2"
implementation "io.ktor:ktor-server-netty:1.3.2"
implementation "io.ktor:ktor-gson:1.3.2"
Run Code Online (Sandbox Code Playgroud)
  1. AndroidMenifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
Run Code Online (Sandbox Code Playgroud)
  1. MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        embeddedServer(Netty, 9000) {
            install(ContentNegotiation) {
                gson {}
            }
            routing {
                get("/") {
                    call.respond(mapOf("message" to "Hello world"))
                }
            }
        }.start(wait = true)
    }
}
Run Code Online (Sandbox Code Playgroud)

什么地方出了错?

运行应用程序后,我收到以下错误并且 Android 本地服务器未启动。

No implementation found for int io.netty.channel.kqueue.Native.sizeofKEvent() 
(tried Java_io_netty_channel_kqueue_Native_sizeofKEvent 
and Java_io_netty_channel_kqueue_Native_sizeofKEvent__)

No implementation found for int io.netty.channel.epoll.Native.offsetofEpollData() 
(tried Java_io_netty_channel_epoll_Native_offsetofEpollData 
and Java_io_netty_channel_epoll_Native_offsetofEpollData__)
Run Code Online (Sandbox Code Playgroud)

android localhost httpserver kotlin ktor

7
推荐指数
1
解决办法
2779
查看次数

在 KtorClient 的 DefaultRequest 中声明 ContentType = Application.Json 后,我可以更改特定请求的 ContentType 标头吗

我正在开发我的 android 项目,我正在创建一个请求函数来上传文件,该函数发出如下请求,

httpClient.put(uri) {
    body = MultiPartFormDataContent(formData {
        append("file", fileContent, Headers.build {
            append(HttpHeaders.ContentType, fileMimeType)
            append(HttpHeaders.ContentDisposition, ContentDisposition.File.withParameter(ContentDisposition.Parameters.FileName, fileOriginalName))
        })
    })
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这个请求有一个 ContentType 标头,但我已经在我的 Ktor HttpClient 中声明了 ContentType 标头,

install(DefaultRequest) {
                url {
                    protocol = URLProtocol.HTTP
                    host = baseURL
                }

                headers {
                    append(HttpHeaders.ContentType, ContentType.Application.Json)
                    append(HttpHeaders.Authorization, accessToken)
                    append(USER, user)
                }
            }
Run Code Online (Sandbox Code Playgroud)

所以我的问题是我的请求将采用哪种 ContentType?如果它不能接受我在请求函数中指定的 ContentType 那么我怎样才能让它接受与默认类型不同的 ContentType 呢?

android content-type ktor

7
推荐指数
1
解决办法
1996
查看次数