接口之多种返回数据类型

近来在做另一个项目接口设计的时候需要考虑这样一个需求,一套接口需兼容两类数据类型(xml和json)。
基于这个项目,原来的接口均为WSDL,遵守的协议为SOAP,它是基于XML的。

于是我想了一些办法做一些扩展,这样的扩展保持WSDL不变的前提下,增加少量代码实现。

由于之前整合Apache CXF用到过,所以很顺利的将其复用过来。

核心代码如下:

复制代码
@RestController
@RequestMapping("/user")
public class UserApiController {


    @PostMapping("/add")
    public int add(@RequestParam String email, @RequestParam String username, @RequestParam String password) {

        try {
            // 接口地址
            String address = "http://127.0.0.1:9090/cxf/user?wsdl";
            // 代理工厂
            JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
            // 设置代理地址
            jaxWsProxyFactoryBean.setAddress(address);
            // 设置接口类型
            jaxWsProxyFactoryBean.setServiceClass(UserService.class);
            // 创建一个代理接口实现
            UserService userService = (UserService) jaxWsProxyFactoryBean.create();

            return userService.addUser(email, username, password);
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }
}
复制代码

上面是之前整合CXF中的客户端写的例子,我在项目中改为如下,减少了内部通信,直接调用service,核心代码如下:

复制代码
@RestController
@RequestMapping("/user")
public class UserApiController {

    @Autowire
    private UserService userService;
    
    @PostMapping("/add")
    public int add(@RequestParam String email, @RequestParam String username, @RequestParam String password) {

           return userService.addUser(email, usern
    }
}
复制代码

这样一来,XML和JSON返回数据类型都兼容,同时请求数据类型既可以是JSON,也可以XML,都能很好的兼容。

当然了,如果只对响应数据类型定义,而不用管请求数据是json还是xml,最简单的办法就是请求头定义(核心是Accept)。

如果是已经写了Controller,原来是JSON数据,现在要求返回XML,还可以这么做,核心配置类如下:

复制代码
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Override
    protected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(true) //是否支持后缀的方式
                .parameterName("mediaType")
                .defaultContentType(MediaType.APPLICATION_JSON)
                .mediaType("xml", MediaType.APPLICATION_XML)   //当后缀名称为xml的时候返回xml数据
                .mediaType("json", MediaType.APPLICATION_JSON);//当后缀名称是json的时候返回json数据
    }


}
复制代码

这样一来针对响应数据类型,你如果要的是xml只需在请求路径加上.xml即可,例如
http://localhost:8080/user/list.xml,
直接能获取xml数据。如果是原来的json数据,路径不变,例如
http://localhost:8080/user/list

http://localhost:8080/user/list.json。

posted @   挑战者V  阅读(2093)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2018-12-19 Linux查看物理CPU个数、核数、逻辑CPU个数
2018-12-19 Nginx端口占用问题
点击右上角即可分享
微信分享提示