• 使用Http Interface客户端解析text/html类型参数


    前言
    Spring6和Spring Boot3的正式发布也有一段时间了,最低支持的java版本也是直接跳到了17。而且最近java21也出来了,作为一个javaer,你不会还在坚守java8吧?

    Http Interface是Spring6新推出的一个声明式http客户端,写法有点像Retrofit。最近也是在一个新的项目里引入了Http Interface,但是目前相关资料还是比较少的,碰到一些问题还是会花费些时间精力。

    问题

    这次遇到的问题是:使用Http Interface请求一个接口,然后用到其中的返回结果做json解析。这个http返回的content-type是text/html; charset=utf-8,我所使用的json解析工具是jackson。但是对其中的内容转java对象时却一直失败,下面是解决方案。

    解决

    问题的原因实际上是Http interface中的jackson解码器不支持解码text/html的类型,因此我们只要让它做到支持就可以了。

    首先在构造WebClient的时候使用.codecs()方法来添加自定义转换器:

    @Configuration
    public class RestClientConfig {
        
        @Bean
        public ChatCompletionDMClient chatCompletionDMClient() {
            WebClient webClient = WebClient.builder()
                    .baseUrl(BASE_URL)
                    // 添加自定义转换text/html;charset=utf-8
                    .codecs(clientCodecConfigurer -> {
                        clientCodecConfigurer.customCodecs()
                                .register(new DecoderHttpMessageReader<Object>(
                                        new TextHtml2HttpMessageConverter()));
                    })
                    .build();
    
            HttpServiceProxyFactory httpFactory = HttpServiceProxyFactory.builder()
                    .clientAdapter(WebClientAdapter.forClient(webClient))
                    .build();
    
            return httpFactory.createClient(ChatCompletionDMClient.class);
        }
    
       
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    接着看一下使用的地方,添加上accept = "text/html; charset=utf-8"

    @PostExchange(url = "/dialogue/",
                contentType = MediaType.MULTIPART_FORM_DATA_VALUE,
                accept = "text/html; charset=utf-8")
        ResponseEntity<DMChatCompletionResult> createChatCompletion(
                @RequestPart("content") String content,
                @RequestPart("history") String history);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这样就可以实现使用http interface来将http结果中的text/html的json数据转为java对象了。

  • 相关阅读:
    怒刷LeetCode的第6天(Java版)
    能够注入Bean的XXXUtil工具类
    起重行业信息汇集
    风力发电机液压偏航控制系统设计
    muduo源码剖析之Buffer缓冲区类
    物联网毕设 -- 基于STM32的心率检测
    RabbitMQ高级篇 笔记
    类和对象7:构造和析构方法
    字符串的方法
    设计模式---六大设计原则
  • 原文地址:https://blog.csdn.net/qq_42893430/article/details/133188574