- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
问题
根据 Ktor tutorial 将 Ktor Kotlin 应用程序部署到 AppEngine 时,Firestore 服务器身份验证不起作用,因此数据未写入指定的 Firestore 数据库。
当应用程序直接在 IntelliJ IDE 中运行时,以及通过 gradle appengineRun
命令使用 ktor 的实现运行时,数据都按预期写入 Firestore。
有两组 AppEngine/Firebase 项目用于暂存环境和生产环境。在使用 gradle appengineDeploy
命令部署之前,正确的 SDK 配置已通过命令 gcloud config configurations list.
激活和验证
奇怪的是,使用这些策略部署的一些应用程序确实写入了 Firestore,但是在再次部署应用程序时,Firestore 没有显示正在写入新数据。
执行
Ktor 设置
我有标准的 ktor 所需文件。我还有一个来自旧实现的旧 MANIFEST.MF 文件。这会导致问题吗?
src/main/resources/application.conf
ktor {
application {
modules = [ Initialization.main ]
}
}
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<threadsafe>true</threadsafe>
<runtime>java8</runtime>
</appengine-web-app>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<servlet>
<display-name>KtorServlet</display-name>
<servlet-name>KtorServlet</servlet-name>
<servlet-class>io.ktor.server.servlet.ServletApplicationEngine</servlet-class>
<!-- path to application.conf file, required -->
<init-param>
<param-name>io.ktor.config</param-name>
<param-value>application.conf</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>KtorServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
.level = INFO
Manifest-Version: 1.0
Main-Class: Initialization
compile 'com.google.firebase:firebase-admin:6.5.0'
compile 'com.google.cloud:google-cloud-firestore:0.58.0-beta'
group 'coinverse'
version '1.0-SNAPSHOT'
buildscript {
ext.kotlin_version = '1.2.61'
ext.junitJupiterVersion = '5.0.3'
ext.ktor_version = '0.9.4'
ext.appengine_version = '1.9.60'
ext.appengine_plugin_version = '1.3.4'
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.3'
classpath "com.google.cloud.tools:appengine-gradle-plugin:$appengine_plugin_version"
}
}
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'war'
apply plugin: 'com.google.cloud.tools.appengine'
sourceSets {
main.kotlin.srcDirs = [ 'src/main/kotlin' ]
}
sourceCompatibility = 1.8
repositories {
mavenCentral()
jcenter()
maven { url "https://kotlin.bintray.com/ktor" }
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile("org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}")
testRuntime("org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}")
testCompile("org.assertj:assertj-core:3.10.0")
testCompileOnly('org.apiguardian:apiguardian-api:1.0.0')
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
compile 'io.reactivex.rxjava2:rxjava:2.2.0'
compile 'com.google.cloud:google-cloud-firestore:0.58.0-beta'
// Or compile 'com.google.cloud:google-cloud-firestore:0.58.0-beta'
compile 'com.google.firebase:firebase-admin:6.5.0'
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
compile "io.ktor:ktor-server-servlet:$ktor_version"
compile "io.ktor:ktor-html-builder:$ktor_version"
providedCompile "com.google.appengine:appengine:$appengine_version"
}
kotlin.experimental.coroutines = 'enable'
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
task run(dependsOn: appengineRun)
appengine {
deploy {
version = 'price-staging-1021653pm'
stopPreviousVersion = false
}
}
// Use the application default credentials
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(credentials)
.setProjectId(projectId)
.build();
FirebaseApp.initializeApp(options);
Firestore db = FirestoreClient.getFirestore();
// Use a service account
InputStream serviceAccount = new FileInputStream("path/to/serviceAccount.json");
GoogleCredentials credentials = GoogleCredentials.fromStream(serviceAccount);
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(credentials)
.build();
FirebaseApp.initializeApp(options);
Firestore db = FirestoreClient.getFirestore();
gradle appengineRun
一起工作,但在部署时不起作用。
val credentials = GoogleCredentials.fromStream(Gson().toJson(FirebaseCredentials(
"service_account",
"project-name",
"asdfghjkl",
"keyStringHere",
"firebase-adminsdk-dhr30@project-name.iam.gserviceaccount.com",
"1234567890",
"https://accounts.google.com/o/oauth2/auth",
"https://oauth2.googleapis.com/token",
"https://www.googleapis.com/oauth2/v1/certs",
"https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-dhr30%40project-name-staging.iam.gserviceaccount.com"
)).byteInputStream())
val options = FirebaseOptions.Builder()
.setCredentials(credentials)
.setDatabaseUrl("https://project-name-staging.firebaseio.com")
.build()
FirebaseApp.initializeApp(options)
.setDatabaseUrl("https://yourProjectName.firebaseio.com")
。
FirestoreOptions firestoreOptions =
FirestoreOptions.getDefaultInstance().toBuilder()
.setProjectId(projectId)
.build();
Firestore db = firestoreOptions.getService();
object FirebaseClient {
val firestore: Firestore
init {
firestore = FirestoreClient.getFirestore()
}
}
init{...}
中创建并作为值存储在对象中。
object FirebaseClient {
val firestore: Firestore
init {
val firestoreOptions = FirestoreOptions.getDefaultInstance().toBuilder()
.setTimestampsInSnapshotsEnabled(true)
.setProjectId("project-name")
.build()
firestore = firestoreOptions.service
}
}
FirebaseClient.firestore.collection(someCollection).document(someDocument).collection(anotherCollection).add(someObject)
最佳答案
在对不同项目使用 Firebase 身份验证后,我发现这不是 Firebase 身份验证的问题,而是应用程序的 问题。主 方法。因此,当部署到 AppEngine 时,上述 Firebase 身份验证的各种实现将按预期工作。
解决方案
我期待应用程序的 主 应用程序部署到 AppEngine 后运行的方法,类似于在 IntelliJ 中运行时调用应用程序的 main 方法的方式。然而我意识到主 仅在调用应用程序的托管路由后才调用。
即:https://[yourProjectName].appspot.com
我创建了一个新的 StackOverflow 帖子以确定 how to run a Ktor app's main method automatically once deployed .
关于Firebase 身份验证不适用于 AppEngine 上的 Ktor 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52922552/
我正在挖掘内置配置支持,并想使用它(而不是仅仅将我自己的配置与 Ktor 的配置一起使用),但我很难弄清楚如何以一种干净的方式来实现它。我有这个,它正在工作,但它真的很难看,我觉得必须有更好的方法:
我目前正在使用 Ktor Netty Engine 创建我的应用程序 当用户向我的服务器发送请求但没有发现任何功能时,我搜索了文档以处理发送电子邮件的任何功能。 post("/api/v1/auth"
KTor 与单元测试配合得很好,但我如何启动我的 ktor 服务器进行集成测试? 我的测试是这样的: @ExperimentalCoroutinesApi class HttpClientTest {
我想弄清楚如何使用 Ktor 检查 http 请求的 http 状态代码 我有一个像这样的简单 GET 请求,其中包含一个 HttpResponseObject 保存服务器返回的数据以及我控制的任何服
我刚刚开始探索 KMM,到目前为止看起来确实不错。 基本上,我想要在一个地方全局处理所有 http 错误代码(如 401、404、500)。 但是,我不确定如何与响应交互。 我在 HttpClient
我刚刚开始探索 KMM,到目前为止看起来确实不错。 基本上,我想要在一个地方全局处理所有 http 错误代码(如 401、404、500)。 但是,我不确定如何与响应交互。 我在 HttpClient
我正在尝试调用一个 twitter 端点,该端点为您提供持续的 json 结果流回客户端 https://documenter.getpostman.com/view/9956214/T1LMiT5U
我正在使用Ktor从Moshi转换为kotlinx序列化的过程,当我尝试提出获取数据的请求时,出现此错误 kotlinx.serialization.MissingFieldException: Fi
我正在将 Ktor 与 kotlin multiplatform 一起使用,我试图弄清楚为什么我没有收到任何抛出的异常。在我的客户端配置中,我使用了 HttpResonseValidator检查返回的
我需要根据正文为请求添加 header 。如何为客户端请求添加拦截器?我试过了 httpClient.requestPipeline.intercept(HttpRequestPipeline.Se
引用Ktor Pool implementation ,有人可以解释一下这个 pop 和 push 实现背后的概念。我试着单步执行代码,但在研究代码后我仍然不聪明。 下面是我难以理解的代码片段:
我是后端开发的新手。基本上,我想创建一个强大而简单的应用程序,它将在参数中接受一个 zip 文件 URL,然后从 URL 下载 zip 文件,最后解压缩 zip 并返回其中的 bin 文件。注意:zi
我想更好地了解Ktor如何处理静态内容的路由。我的静态文件夹(工作目录)中具有以下层次结构: - static - index.html - (some files) - static -
我是 Kotlin 和 Ktor 的新手,所以我尝试做简单的发布请求。正如你在下面看到的,没有什么特别的。 routing { post("/articles/add"){
KTOR中HttpClient的正确用法是什么?我应该在每个应用程序生命周期中像单例一样使用它,还是应该在每个请求中创建它? 最佳答案 我想说,如果您需要连接多个逻辑服务,则每个应用程序可能有多个客户
我做了什么? 在 build.gradle 下添加了依赖项 implementation "io.ktor:ktor:1.3.2" implementation "io.ktor:ktor-serve
我正在使用 ktor v0.9.2,我想根据用户是否通过身份验证为同一路由发送不同的内容。 我遇到的问题是我无法访问 authenticate { } 之外的主体。堵塞。 我的设置是这样的: data
我是 Kotlin 和 Ktor 的新手,想看看身份验证部分,所以我得到了以下代码。 路由“/”和“/bye”工作正常,但路由“登录”给定空白页! package blog import kotlin
当我使用 Retrofit 时,我可以轻松地创建日志记录拦截器以在 logcat 上查看带有正文和 header 的调用: val loggingInterceptor = HttpLoggingI
我一直在关注 ktor tutorial用于制作网站并注意到每次我对资源文件进行更改时,我都必须重新编译才能在浏览器中看到它的更新。有什么方法可以热重载静态文件以加快开发速度吗?如果重要的话,我会使用
我是一名优秀的程序员,十分优秀!