使用带有 Ktor 的服务器的 Kotlin 多平台项目中的 CORS 问题

问题描述 投票:0回答:1

我有一个演示项目,我正在其中测试 Android 的各种架构方法、模式和技术。目前,我正在使用 Kotlin Multiplatform 进行服务器端工作,遇到了一个我无法自行解决的技术问题。任务如下:我有一个 Ktor 服务器,它根据请求返回对象列表:

fun main() {
    embeddedServer(Netty, port = 8080, host = "0.0.0.0", module = Application::module)
        .start(wait = true)
}

fun Application.module() {
    routing {
        get("/repos/octocat/Spoon-Knife/forks") {
            call.respondText(forksJson(), ContentType.Application.Json, HttpStatusCode.OK)
        }
    }
}

还有一个客户端 - 一个也使用 Ktor 向服务器发送请求以检索对象列表的网站:

HttpClient {
    install(ContentNegotiation) {
        json(Json {
            prettyPrint = true
            isLenient = true
            ignoreUnknownKeys = true
        })
    }
}

我在同一台笔记本电脑 (macOS) 上运行服务器和 Web 应用程序。当尝试执行请求时,我收到以下错误:

Access to fetch at 'http://localhost:8080/repos/octocat/Spoon-Knife/forks' from origin 'http://localhost:8081' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

我尝试了不同的解决方案,例如在服务器上设置CORS:

install(CORS) {
    allowMethod(HttpMethod.Options)
    allowMethod(HttpMethod.Get)
    allowMethod(HttpMethod.Post)
    allowHeader(HttpHeaders.XForwardedProto)
    allowHeader(HttpHeaders.Authorization)
    allowHeader(HttpHeaders.ContentType)
    allowCredentials = true
    anyHost() 
}

以及客户端设置:

httpClient.get("${baseUrl}repos/octocat/Spoon-Knife/forks") {
    headers.append("Access-Control-Allow-Origin", "http://localhost:8080")
    headers.append("Access-Control-Allow-Credentials", "true")
}

不幸的是,一切都没有达到预期的结果。如果有任何帮助,我将不胜感激。

kotlin cors kotlin-multiplatform ktor
1个回答
0
投票

在服务器中设置 CORS 时,您忘记添加一个标头,这导致了问题。如果您添加访问控制允许来源的标头,它应该可以正常工作。你可以这样添加

allowHeader(AccessControlAllowOrigin)

© www.soinside.com 2019 - 2024. All rights reserved.