当前位置: 首页 > 知识库问答 >
问题:

spring-boot中使用web-client将文本/HTML响应解析为xml

陶和歌
2023-03-14

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

Content type 'text/html' not supported for bodyType=Response

API实际响应

<?xml version='1.0' encoding='UTF-8'?>
<response version="1.0">
    <responseCode>200</responseCode>
    <responseMsg>some message</responseMsg>
</response>

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

JSON decoding error: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')

下面是我的代码:API调用

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()
    @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))
    }
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "response")
data class Response(
    @XmlElement
    val responseCode: String = "2000",
    @XmlElement
    val responseMsg: String = "OK",
)
clientCodecConfigurer.defaultCodecs().jaxb2Decoder(Jaxb2XmlDecoder())
clientCodecConfigurer.defaultCodecs().jaxb2Encoder(Jaxb2XmlEncoder())
message : Content type 'text/html' not supported for bodyType=Response

共有1个答案

阮雅达
2023-03-14

默认情况下,Jaxb2XmlDecoder默认构造函数没有“text/html”。您需要使用Jaxb2XmlDecoder(mimetype...supportedMimeTypes)来传递它,例如:

clientCodecConfigurer.defaultCodecs().jaxb2Decoder(
Jaxb2XmlDecoder(MimeTypeUtils.APPLICATION_XML, MimeTypeUtils.TEXT_XML, MediaType("application", "*+xml"), MimeTypeUtils.TEXT_HTML))
 类似资料:
  • 我有一个非常简单的java spring boot swagger项目。 仅出于测试目的,我创建了两个映射类:name。java和名称容器。JAVA ............... 对于响应,我使用一个@get方法: 但是如果我尝试使用products=“text/html” 响应体是; 问题是,是否有可能映射我现有的对象NamesContainer.java,以生成超文本标记语言响应,以及如何做

  • 问题内容: 我在使用Javascript的代码中使用AJAX调用。 编辑: 我已经更新了我的回调函数。但是在这里,我收到了选择列表作为[对象节点列表]。现在如何在HTML中显示? 在回调函数中,我现在想以HTML格式接收响应,因此我想解析该HTML响应,以便进一步处理它。我正在使用普通的javascript来做到这一点。如何解析以HTML格式接收的Ajax响应? 问题答案: 创建一个元素并将HTM

  • 问题内容: 我正在做一个Maven项目,该项目使我可以解析网站中的html数据。我可以使用下面的代码来解析它: 到目前为止,我还没有问题。我可以解析html数据。我正在从jsoup中使用select方法,并使用“ div.col- section”检索数据,这意味着我正在使用class为col- section的div元素进行查找。我想在textarea中打印数据。即使网站上的实际数据超过一个段落

  • 问题内容: 好的,这真的让我感到沮丧,因为我已经做过一百次了,但是这次却没有用。所以我知道我做错了,我只是想不通。 我正在使用jQuery .get例程从另一个文件加载html。我不想使用.load(),因为它总是替换我要将内容加载到其中的元素的子元素。 这是我的.get请求: 文件’info.html’是具有正确doctype的标准xhtml文件,并且体内唯一的一件事是我需要访问的一系列ul。由

  • 到目前为止我没有问题。我可以解析html数据。我使用jsoup中的select方法,并使用“div.col-section”检索数据,这意味着我要查找类为col-section的div元素。我想用文本区打印数据。结果,我有一个巨大的一个段落,即使在网站上的真实数据是不止一个段落。那么如何像网站上一样解析数据呢?

  • 我刚刚将我的Gradle更新到3.4.1。我的一个模块内有一个API调用。我正在使用应用程序内的模块: 现在,当我用ProGuard生成一个签名的构建时,对象为空,这意味着retrofit不能解析该对象。 附注:在调试模式下,或者我用Gradle版本3.3.2运行应用程序时,这很好 我的改造ProGuard文件: 我的OkHttp proGuard文件: 我的GSON proguard文件: