接⼝之多种返回数据类型
近来在做另⼀个项⽬接⼝设计的时候需要考虑这样⼀个需求,⼀套接⼝需兼容两类数据类型(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 = "127.0.0.1:9090/cxf/user?wsdl";
// 代理⼯⼚
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
// 设置代理地址
jaxWsProxyFactoryBean.setAddress(address);
// 设置接⼝类型
jaxWsProxyFactoryBean.setServiceClass(UserService.class);
// 创建⼀个代理接⼝实现
UserService userService = (UserService) ate();
return userService.addUser(email, username, password);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
}
json值的类型有哪些上⾯是之前整合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 t.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.fig.annotation.ContentNegotiationConfigurer;
import org.springframework.fig.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即可,例如直接能获取xml数据。如果是原来的json数据,路径不变,例如

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。