我正在使用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)
如果我遗漏了任何相关信息,请告诉我,
谢谢!
如何监控 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) 我正在尝试在我的 Ktor 应用程序中安排一项任务,但是我无法在网上找到有关如何执行此操作的任何信息。有没有人有任何建议或以前能够做到这一点?
我是 Kotlin 和 Ktor 的新手,当我尝试为我的 Web 应用程序实现身份验证时,我需要存储用户的密码。但是,我似乎无法通过 Ktor Core 或外部 java 依赖项找到一种方法来哈希密码并验证它们。
我发现了一些关于如何使用 BCrypt 或 PBKDF2 进行散列的文章,但这些文章要求我自己进行散列实现,这似乎不安全,因为我将不得不担心维护它。
password_hash()和password_verify())我正在为一个项目尝试 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-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。我怎样才能使用纯文本来做到这一点?
我已经知道如何接收 JSON 对象并自动将其反序列化为所需的格式(例如,使用数据类)。另请参阅:如何在 Ktor 中接收 JSON 对象?
我现在的问题是我想验证 JSON 请求,BadRequest如果它不是所需的格式,则返回,类似于 Django:https : //stackoverflow.com/a/44085405/5005715
我怎样才能在 Ktor/Kotlin 中做到这一点?不幸的是,我在文档中找不到解决方案。此外,必填/可选字段会很好。
我在服务器上使用 ktor 并有一个可能执行很长时间(一分钟或更长时间)的请求。我想检测客户端请求取消以释放资源并取消长时间运行的操作。有什么办法可以做到吗?
提前致谢
build.gradleimplementation "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)
AndroidMenifest.xml<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
Run Code Online (Sandbox Code Playgroud)
MainActivity.ktclass 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 项目,我正在创建一个请求函数来上传文件,该函数发出如下请求,
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 呢?
ktor ×10
kotlin ×9
android ×2
build.gradle ×1
content-type ×1
gradle ×1
httpserver ×1
java ×1
json ×1
ktor-client ×1
localhost ×1
scheduling ×1
server ×1