调用http post方法时,用于xml数据的序列化器(Ktor lib)

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

由于我是Android的新手,因此我正在构建一个应用程序,需要在该应用程序中更新Geo服务器上的图层数据。对于这种情况,我将与XML正文请求一起调用post方法。

我需要在请求正文中以xml格式发送数据,并且需要以xml格式获取响应。为此,我尝试使用XmlSerializer代替JsonFeature,但出现错误,提示“ XmlSerializer不是同伴对象,需要在此处初始化”

val httpClient = HttpClient {
        install(JsonFeature) {
            serializer = KotlinxSerializer(Json.nonstrict)
                }
             }

预先感谢!

android json kotlin xmlserializer ktor
1个回答
0
投票

没有XML相关功能,但是可以将现有的Json与XML序列化程序一起使用

您要做的第一件事是找到合适的序列化器。我使用了https://github.com/pdvrieze/xmlutil

implementation("net.devrieze:xmlutil-android:0.20.0.1")

您还可以使用其他平台依赖项(我使用了JVM和多平台)。

接下来,您可以使用自定义串行器配置JsonFeature功能:

val client = HttpClient {
    Json {
        serializer = XMLSerializer()
        accept(ContentType.Application.Xml)
    }
}

使用ContentType.Application.Xml

最后,添加序列化器:

@OptIn(ImplicitReflectionSerializer::class)
class XMLSerializer(private val format: XML = XML()) : JsonSerializer {

    override fun read(type: TypeInfo, body: Input): Any {
        val text = body.readText()
        val deserializationStrategy = format.context.getContextual(type.type)

        val mapper = deserializationStrategy
            ?: type.kotlinType?.let { serializer(it) }
            ?: type.type.serializer()

        return format.parse(mapper, text) ?: error("Failed to parse response of type $type. The result is null.")
    }

    override fun write(data: Any, contentType: ContentType): OutgoingContent {
        val serializer = data::class.serializer() as KSerializer<Any>
        val text = format.stringify(serializer, data, null)
        return TextContent(text, contentType)
    }
}

这里是服务器的完整结果示例(在没有Android的情况下可以运行):https://gist.github.com/e5l/3b4d5d704b4d7c6e2a65cf68de8e9ca4

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