【发布时间】:2021-09-10 11:21:55
【问题描述】:
当我将常规路由 API 与 GSON 一起使用时,我可以使用以下代码 sn-p 将 JSON 参数反序列化为 Map
post("/books") {
val request = call.receive<Map<String, Any>>()
...
}
在我的例子中,请求是 com.google.gson.internal.LinkedTreeMap 的一个实例。
有没有办法使用 Location API 来做同样的事情?当我用具体成员定义数据类但我找不到使用地图的方法时,它工作正常。我正在尝试这些方面的几件事:
@Location ("/books")
<some magic class definition>
fun Application.bookModule() {
routing {
post<BookRequest> {
val request = call.receive<BookRequest>()
...
}
但我还没有想出任何可行的方法。帮忙?
【问题讨论】:
-
我可以将
call.receive<Map<String, Any>>()与标准路由一起使用,并与Locations插件中的一个一起使用。您能否解释一下您的实际行为是什么? -
我的印象是使用@Location 注释的类型必须与用于参数的类型相同。不是这样吗?目前我有
-
@Location ("/books") data class BookRequest(val title: String, val author: String, val detail: Map<String, Any>) fun Application.bookModule() { routing { post<BookRequest> { val request = call.receive<Map<String, Any>>() println(request) call.respond(HttpStatusCode.OK) } } } -
当我用
curl --header "Content-Type: application/json" \ --request POST \ --data '{"title":"Hitchhiker", "author":"DNA", "detail":{"foo": "bar"}}' \ http://localhost:8080/books调用它时,这会导致 404。当我在下一条评论中实现 get 请求时,它会起作用。 @AlekseiTirman - 感谢您对此进行调查。 -
fun Application.bookModule() { routing { get<BookRequest> { val books = bookHandler.listBooks() val bookRefs = books.map { BookListItem( it.title, URLBuilder(locations.href(BookSearchRequest(it.isbn))).build() ) } val message = FreeMarkerContent("books/booklist.ftl", mapOf("books" to bookRefs)) call.respond(message) }
标签: ktor