OpenAPI扩展插件:序列化出入参

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

OpenAPI扩展插件:序列化出入参

变更记录


产品版本

更新内容更新日期
V5.0.018初始版本2023年3月
V6.0.8序列化插件新增方法,支持获取全部参数2024年4月




1 简介

1.1 功能介绍

OpenAPI支持在操作API、自定义API、脚本API中注册序列化插件,通过编写插件,可以根据具体业务场景自定义API的出参和入参的序列化和反序列化类。


1.2 系统路径

【开放服务云】→【OpenAPI】→【API管理】 →【API开发】


2 主要操作

2.1 反序列化入参

当接口传参时,可能存在请求头Content-Type类型为Text/plain,但OpenAPI暂没对这种类型的入参进行处理,那么此时可以编写反序列化插件进行入参的反序列化,拿到反序列化后的入参后,对入参进行干预。



1)首先,用户需要编写反序列化插件,在类中需实现对应接口,该方法中,request即为还没反序列化的原入参,处理逻辑是将原Text/plain类型的入参反序列化为map,然后进行入参干预处理,最后返回这个map给OpenAPI进行处理。


操作

接口

重写方法

反序列化

kd.bos.openapi.api.plugin.ApiDeserializerPlugin

deserializer


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import kd.bos.openapi.api.plugin.ApiDeserializerPlugin;
import kd.bos.openapi.common.constant.MediaType;

import java.util.Map;

public class DemoApiDeserializerPlugin implements ApiDeserializerPlugin {
	private static final long serialVersionUID = 4568461229506221705L;

	@Override
	public Map<String, Object> deserializer(String request, String contentType) {
		try {
			if(contentType.contains(MediaType.TEXT_PLAIN)){
				//请求的text/plain类型反序列化为Map
				Map<String, Object> map = new ObjectMapper().readValue(request, new TypeReference<Map<String, Object>>() {});
				//干预入参
				Map<String, Object> data = (Map<String, Object>) map.get("data");
				data.put("billno","unittest-001");
				return map;
			}else if(contentType.contains(MediaType.APPLICATION_XML)){
				//XML格式反序列化逻辑
				return ...;
			}else {
				return ...;
			}
		} catch (JsonProcessingException e) {
			throw new RuntimeException(e);
		}
	}
}


2)接下来,回到OpenAPI应用,在API详情中注册并启用插件。



3)最后,点击“API测试”按钮,打开在线测试弹窗,在系统中实时调试API功能,若插件执行生效,Text文本时正常能正常解析入参并返回保存结果。

 


2.2 序列化出参

在实际的业务场景中,第三方需要接收的返回参数可能是特定的非JSON格式数据,如Text文本格式,结果不带引号,那么此时也可以通过编写序列化插件对出参进行个性化处理。


1)首先,仍然是编写插件,重写serialize方法。


操作

接口

重写方法

序列化

kd.bos.openapi.api.plugin.ApiSerializerPlugin

serialize

其中参数response为还没序列化的原出参,这里逻辑直接重新返回一个自定义的字符文本。

注意:序列化出参插件严禁直接抛出异常,需要用户自行处理并返回异常错误信息。


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import kd.bos.openapi.api.plugin.ApiSerializerPlugin;
import kd.bos.openapi.api.plugin.SerializerResult;
import kd.bos.openapi.common.constant.MediaType;

public class DemoApiSerializerPlugin implements ApiSerializerPlugin {
	private static final long serialVersionUID = 1747368553053757065L;

	@Override
	public SerializerResult serialize(Object response, String accept, String contentType) {
		try {
			if (contentType.contains(MediaType.APPLICATION_JSON)) {
				//返回text文本
				String responseStr = new ObjectMapper().writeValueAsString(response);
				return new SerializerResult(MediaType.TEXT_PLAIN, "实际返回:" + responseStr);
			} else {
				//其他类型的出参序列化
				return ...;
			}
		} catch (JsonProcessingException e) {
			//处理异常时严禁抛出异常,可以定义自己的错误返回信息
			String result="...";
			return new SerializerResult(MediaType.TEXT_PLAIN,result);
		}
	}
}	


2)接下来,用户需要注册插件并打开在线测试弹窗,在系统中实时调试API功能,若插件执行生效,则返回参数会从被替换成自定义的Text文本出参。




补充说明:若用户在集成场景中需要获取全部参数,扩展插件也提供了以下序列化方法来获取更多参数。

	/**
	 * 模型参数序列化方法,提供更多参数信息
	 **/ 
	@Override
	public SerializerResult serializeByModel(ApiSerializerModel model) {
		String s = JacksonUtil.writeValueAsPrettyString(model.getResponse());
		return new SerializerResult(MediaType.APPLICATION_JSON, s);
	}

	/**
	 * 根据版本来决定执行那个序列化方法 (只需要实现相应版本的序列化方法即可)
	 * ApiSerializerVersion.DEFAULT -  执行 serialize 序列化方法(默认)
	 * ApiSerializerVersion.MODEL	-  执行 serializeByModel 序列化方法
	 **/ 
	@Override
	public ApiSerializerVersion getVersion() {
		return ApiSerializerVersion.MODEL;
	}
}


3 更多资讯

关于OpenAPI的更多资讯,请随时关注新特性公告

OpenAPI扩展插件:序列化出入参

变更记录产品版本更新内容更新日期V5.0.018初始版本2023年3月V6.0.8序列化插件新增方法,支持获取全部参数2024年4月1 简介1.1 功能介绍Op...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息