我有一个演示项目,我正在其中测试 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")
}
不幸的是,一切都没有达到预期的结果。如果有任何帮助,我将不胜感激。
在服务器中设置 CORS 时,您忘记添加一个标头,这导致了问题。如果您添加访问控制允许来源的标头,它应该可以正常工作。你可以这样添加
allowHeader(AccessControlAllowOrigin)