【发布时间】:2021-03-27 14:06:47
【问题描述】:
我正在尝试使用 Kotlin Coroutines 对 Http Request 进行编码,如
中所述据我所见,我的代码与这两个示例都非常接近:
package com.tolearn.service
import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
import java.net.http.HttpResponse.BodyHandlers
import javax.inject.Inject
import javax.inject.Named
import javax.inject.Singleton
@Singleton
class DemoService {
fun postDemo(key: String, msg: String){
suspend fun getCoroutine(){
val someData = getData()
print(someData)
}
suspend fun getData(): String {
val client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.build();
val request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:3000/employees"))
.build();
val response = client.sendAsync(request, BodyHandlers.ofString());
return response.await().body() ***here I get Unresolved reference: await
//return response.get().body() ***this line works but I understand I should prefer use previous line with "awai()" instead of "get()"
}
}
}
我的最终目标是公开一个端点(控制器),它将在 Suspend 函数内调用另一个端点 throw java.net.http.HttpClient。我的微服务是完全无状态的,需要尽可能地更快、更轻。这是我第一次编写 Kotlin Coroutine。根据理论研究,我理解协程比线程便宜,我为协程做了一个很好的选择。尽管如此,我还是新手,并且正在为诸如错误/异常处理之类的疑问而苦苦挣扎,更直接地,为什么我会得到未解决的参考:等待
所以我的直截了当的问题是:为什么 return response.await().body() 导致 Unresolved reference: await?我应该用 response.get().body() 替换吗?
我们将高度赞赏任何其他建议或提示。
***编辑
这是我的 build.gradle。我刚刚添加了 kotlinx-coroutines-jdk8:1.4.2
plugins {
id("org.jetbrains.kotlin.jvm") version "1.4.10"
id("org.jetbrains.kotlin.kapt") version "1.4.10"
id("org.jetbrains.kotlin.plugin.allopen") version "1.4.10"
id("com.github.johnrengelman.shadow") version "6.1.0"
id("io.micronaut.application") version "1.2.0"
id("com.google.protobuf") version "0.8.13"
}
version = "0.1"
group = "com.tolearn"
repositories {
mavenLocal()
jcenter()
mavenCentral()
}
micronaut {
testRuntime("junit5")
processing {
incremental(true)
annotations("com.tolearn.*")
}
}
dependencies {
implementation("io.micronaut:micronaut-validation")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
implementation("io.micronaut.kotlin:micronaut-kotlin-runtime")
implementation("io.micronaut:micronaut-runtime")
implementation("io.micronaut.grpc:micronaut-grpc-runtime")
implementation("javax.annotation:javax.annotation-api")
implementation("io.micronaut.kafka:micronaut-kafka")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.4.2")
runtimeOnly("ch.qos.logback:logback-classic")
runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin")
testImplementation("io.micronaut:micronaut-http-client")
}
application {
mainClass.set("com.tolearn.ApplicationKt")
}
java {
sourceCompatibility = JavaVersion.toVersion("11")
}
tasks {
compileKotlin {
kotlinOptions {
jvmTarget = "11"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "11"
}
}
}
sourceSets {
main {
java {
srcDirs("build/generated/source/proto/main/grpc")
//srcDirs 'build/generated/source/proto/main/grpckt'
srcDirs("build/generated/source/proto/main/java")
}
}
}
protobuf {
protoc { artifact = "com.google.protobuf:protoc:3.14.0" }
plugins {
grpc { artifact = "io.grpc:protoc-gen-grpc-java:1.33.1" }
//grpckt { artifact = "io.grpc:protoc-gen-grpc-kotlin:1.0.0" }
}
generateProtoTasks {
all()*.plugins {
grpc {}
//grpckt {}
}
}
}
【问题讨论】:
-
await()是一个扩展函数,因此您需要像导入类一样导入它。如果无法导入,请确保您的项目依赖项中有kotlinx-coroutines-jdk8库。这就是扩展功能的由来。 -
我添加了 kotlinx-coroutines-jdk8。谢谢。但我仍然得到未解决的参考:等待。我必须以某种方式导入等待吗?有点奇怪,因为 response é 由 client.sendAsync 填写。如果我错过了什么,请问您能看到我的导入吗?
-
是的,你需要自己导入扩展函数。在 IntelliJ 或 Android Studio 中,您可以将光标放在上面,然后按 Alt+Enter,它会建议自动执行此操作。
-
这就是问题所在:IntelliJ 它不建议任何导入。
-
你可以用
import kotlinx.coroutines.future.await导入
标签: kotlin kotlin-coroutines coroutine java-http-client coroutinescope