• 使用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对象了。

  • 相关阅读:
    java 模拟输入
    stm32 - GPIO
    搞定“项目八怪”,你就是管理高手!
    Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类、contains函数判断数据列是否包含指定字符串生成布尔值序列
    2022-11-05 mysql-派生表-解读
    TrOCR模型微调【基于transformer的光学字符识别】
    运算放大器学习笔记
    【无标题】
    谷粒学院16万字笔记+1600张配图(十三)——搭建前台环境、首页数据显示
    Vue15 计算属性VS监视属性(侦听属性)
  • 原文地址:https://blog.csdn.net/qq_42893430/article/details/133188574