首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在spring中用web-client解析对xml的text/html响应

在spring中用web-client解析对xml的text/html响应
EN

Stack Overflow用户
提问于 2020-10-29 08:56:10
回答 1查看 4.2K关注 0票数 0

当我试图在xml类中解析响应时,我正在调用一个API,它用内容类型"text/html“返回xml响应,得到的是错误消息:

代码语言:javascript
复制
Content type 'text/html' not supported for bodyType=Response

API的实际响应

代码语言:javascript
复制
<?xml version='1.0' encoding='UTF-8'?>
<response version="1.0">
    <responseCode>200</responseCode>
    <responseMsg>some message</responseMsg>
</response>

我添加了自定义编解码器来解决这个问题,但不知怎么的,它不起作用。当我添加json解码错误时:

代码语言:javascript
复制
JSON decoding error: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')

下面是我的代码: API调用

代码语言:javascript
复制
return webClient.get()
            .uri { builder ->
                builder.path("/apiPath")
                    .queryParams(queryParams)
                    .build()
            }
            .retrieve()
            .onStatus({ it != HttpStatus.OK }) {
                RuntimeException("").toMono()
            }
            .bodyToMono(Response::class.java)
            .doOnError {
                logger.error { "Error" }
            }.block()

web客户端构建器

代码语言:javascript
复制
    @Bean
    fun webClient(): WebClient = WebClient.builder()
        .exchangeStrategies(ExchangeStrategies.builder().codecs(this::acceptedCodecs).build())
        .baseUrl("apiUrl")
        .build()

    private fun acceptedCodecs(clientCodecConfigurer: ClientCodecConfigurer) {
        clientCodecConfigurer.customCodecs().register(Jackson2JsonEncoder(ObjectMapper(), TEXT_HTML))
        clientCodecConfigurer.customCodecs().register(Jackson2JsonEncoder(ObjectMapper(), TEXT_HTML))
    }

响应类

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "response")
data class Response(
    @XmlElement
    val responseCode: String = "2000",
    @XmlElement
    val responseMsg: String = "OK",
)

我认为添加自定义编解码器部分需要修改,但我没有得到确切的更改。请告诉我我哪里做错了。谢谢。

编辑:我试图像这样修改XML的exchangeStrategies

代码语言:javascript
复制
clientCodecConfigurer.defaultCodecs().jaxb2Decoder(Jaxb2XmlDecoder())
clientCodecConfigurer.defaultCodecs().jaxb2Encoder(Jaxb2XmlEncoder())

但也有同样的错误

代码语言:javascript
复制
message : Content type 'text/html' not supported for bodyType=Response
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-30 01:00:08

默认情况下,Jaxb2XmlDecoder默认构造函数没有"text/html“。你需要把它传递给使用Jaxb2XmlDecoder(MimeType.( supportedMimeTypes)例如:

代码语言:javascript
复制
clientCodecConfigurer.defaultCodecs().jaxb2Decoder(
Jaxb2XmlDecoder(MimeTypeUtils.APPLICATION_XML, MimeTypeUtils.TEXT_XML, MediaType("application", "*+xml"), MimeTypeUtils.TEXT_HTML))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64587787

复制
相关文章

相似问题

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