首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用http post方法时xml数据的序列化程序(Ktor lib)

调用http post方法时xml数据的序列化程序(Ktor lib)
EN

Stack Overflow用户
提问于 2019-08-05 15:18:01
回答 1查看 764关注 0票数 7

因为我是Android的新手,所以我正在构建一个应用程序,其中我需要更新Geo服务器上的图层数据。对于该场景,我将调用带有XML主体请求的post方法。

我需要在请求体中发送xml格式的数据,并需要在xml中获得响应。为此,我尝试使用XmlSerializer而不是JsonFeature,但是我得到错误提示"XmlSerializer不是comapanion对象,需要在这里初始化“

代码语言:javascript
复制
val httpClient = HttpClient {
        install(JsonFeature) {
            serializer = KotlinxSerializer(Json.nonstrict)
                }
             }

提前感谢!!

EN

回答 1

Stack Overflow用户

发布于 2020-06-15 16:57:07

这里没有与XML相关的特性,但是您可以将现有的Json与XML序列化程序一起使用。

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

代码语言:javascript
复制
implementation("net.devrieze:xmlutil-android:0.20.0.1")

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

接下来,您可以使用自定义序列化程序配置JsonFeature功能:

代码语言:javascript
复制
val client = HttpClient {
    Json {
        serializer = XMLSerializer()
        accept(ContentType.Application.Xml)
    }
}

使用ContentType.Application.Xml

最后,添加序列化程序:

代码语言:javascript
复制
@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)
    }
}

以下是服务器的完整结果示例(采用在没有安卓系统的情况下运行):https://gist.github.com/e5l/3b4d5d704b4d7c6e2a65cf68de8e9ca4

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57353827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档