ITKeyword,专注技术干货聚合推荐

注册 | 登录

如何mock合作方的报文(报文可设置)

xkhgnc_6666 分享于 2016-06-29

2019阿里云双11返场狂欢继续,
地址https://www.aliyun.com/1111/2019/home

mock合作方的报文,其实就是通过调用一个接口,接口返回值跟合作方的报文一模一样,但是有些合作方返回的报文非常长,如果通过java拼装的话,会非常复杂,而且由于返回的报文是固定的,这时候如果把这些内容固定在一个模板上面,直接把模板返回给调用者是不是更简单些呢?这里通过freemarker就可以实现这个功能,下面我们来看看具体如何来实现;

大致的思路:我们先把合作方给的报文放在一个模板里面,结合freemarker把模板转换成流的形势返回给调用者;

接口信息: 请求方式 POST /vehicle/input 请求参数 字段名 类型 必选 描述 city_code string 是 投保城市 license_no string 是 车牌号 license_owner string 是 车主姓名 frame_no string - 车架号 engine_no string - 发动机号 vehicle_name string - 行驶证上的品牌型号 enroll_date string - 初次登记日期 seat_count integer - 座位数 接口调用的入口: package com.mockCommon.controller.mock.youbi;import java.util.Map;import org.apache.commons.lang.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.mockCommon.constant.LogConstant;import com.mockCommon.service.mock.youbi.CarTypeMockService;@Controllerpublic class CarTypeMockController {

@Autowired

private CarTypeMockService carTypeMockService;

@RequestMapping(value="/vehicle/input",method=RequestMethod.POST)

@ResponseBody

public String vehicleInput(@RequestBody Map<String,Object> params){

LogConstant.runLog.info("[JiekouInputCarModel]parameter city_code:"

+ params.get("city_code") + ", license_no:"

+ params.get("license_no")+ ", license_owner:"

+ params.get("license_owner")+ ", frame_no:"

+ params.get("frame_no")+ ", engine_no:"

+ params.get("engine_no")+ ", vehicle_name:"

+ params.get("vehicle_name")+ ", enroll_date:"

+ params.get("enroll_date")+ ", seat_count:"

+ params.get("seat_count"));

if (params.get("city_code") == null || params.get("license_no") == null

|| params.get("license_owner") == null

|| params.get("frame_no") == null||params.get("engine_no") == null

|| params.get("vehicle_name") == null ||params.get("enroll_date") == null

|| params.get("seat_count") == null ) {

return "传递参数不正确";

}

String result = carTypeMockService.vehicleInput(params.get("city_code").toString(),

params.get("license_no").toString(),

params.get("license_owner").toString(), params.get("frame_no")

.toString(), params.get("engine_no").toString(), params

.get("vehicle_name").toString(), params.get("enroll_date")

.toString(), params.get("seat_count").toString());

return result;}} /** *

*/package com.mockCommon.service.mock.youbi.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.mockCommon.constant.ContextConstant;import com.mockCommon.constant.LogConstant;import com.mockCommon.model.mock.pingan.BaoJiaConfigMockModel;import com.mockCommon.model.mock.youbi.CarTypeMockModel;import com.mockCommon.service.mock.youbi.CarTypeMockService;import com.mockCommon.util.freeMarker.IDataMaker;/** * @author kaixie * */@Servicepublic class CarTypeMockServiceImpl implements CarTypeMockService{

@Autowired

private IDataMaker<CarTypeMockModel> carTypeMockFreeMarker;

@Override

public String vehicleInput(String citycode, String licenseNo,

String licenseOwner, String frameNo, String engineNo,

String vehivleName, String enrollDate, String seatCount) {

String result = null;

CarTypeMockModel carTypeMockModel = new CarTypeMockModel();

carTypeMockModel.setVehicleId("287ncekk7lj3qkpw");

LogConstant.runLog.info("[baoxian-cartype]mock result is:" + carTypeMockModel);

result = carTypeMockFreeMarker.generateData2output(ContextConstant.PREFIX_CARTYPE_MOCK, carTypeMockModel);

LogConstant.runLog.info("[baoxian-cartype]mock result is:" + result);

return result;

}}这部分carTypeMockFreeMarker.generateData2output就是把模板数据转化为String类型数据返回给调用方,这部分的实现就是通过freemarker对模板数据进行转化; //返回流

@Override

public String generateData2output(String prefix, T role) {

String result = "error";

OutputStreamWriter writer = null;

try {

LogConstant.runLog.info("-----------------templatePath: "

+ templateFolderPath + "/" + this.templateName + prefix);

LogConstant.runLog.info("-----------------outputPath: "

+ outputFolderPath + outputName + prefix);

freeMarkerCfg.setDirectoryForTemplateLoading(new File(

templateFolderPath));

template = freeMarkerCfg.getTemplate(this.templateName + prefix);

Map<String, T> parameters = new HashMap<String, T>();

parameters.put("data", role);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

writer = new OutputStreamWriter(baos);

template.process(parameters, writer);

writer.flush();

result = baos.toString();

} catch (IOException | TemplateException e) {

e.printStackTrace();

} finally {

IOUtils.closeQuietly(writer);

}

return result;

} outputName和templateName是怎么来的,可以见:java反射之getGenericSuperclass方法的用处; 另外在项目启动的时候spring会通过注解@Repository来获取到类GetBaoJiaMockModel对应数据模板的前后缀; package com.mockCommon.util.freeMarker.impl.youbi;import org.springframework.stereotype.Repository;import com.mockCommon.model.mock.youbi.CarTypeMockModel;import com.mockCommon.util.freeMarker.impl.BaseFreeMarkerDataMaker;@Repository("carTypeMockFreeMarker")public class CarTypeMockFreeMarker extends BaseFreeMarkerDataMaker<CarTypeMockModel>{

public CarTypeMockFreeMarker() {

super();

}} 这里模板如附件所示:http://download.csdn.net/my/uploads中的报文数据模板 对用的model package com.mockCommon.model.mock.youbi;import com.mockCommon.util.freeMarker.DataTemplate;@DataTemplate(template = "cartype_template.json", output = "cartype_out.json")public class CarTypeMockModel { private String vehicleId;public String getVehicleId() {

return vehicleId;}public void setVehicleId(String vehicleId) {

this.vehicleId = vehicleId;}} 报文里面只有这部分""vehicle_id": "${data.vehicleId!""}", "是设置的其他的部分都是固定的 执行结果: 返回的报文除了vehicle_id是设置的其他的都是在数据模板中固定的,该文后续会进一步细化......

        mock合作方的报文,其实就是通过调用一个接口,接口返回值跟合作方的报文一模一样,但是有些合作方返回的报文非常长,如果通过java拼装的话,会非常复杂,而且由于返回的报文是固定的,

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。