电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

还不会自定义OpenAPI出入参?快看这篇锦囊妙计!

来源:金蝶云社区作者:金蝶2024-09-235

还不会自定义OpenAPI出入参?快看这篇锦囊妙计!

当使用OpenAPI时,开发者常常面临一个难题:如何自定义API的输入和输出数据参数和格式,来满足特定业务场景的需求?如果你也曾经感到烦恼,那么不用担心,OpenAPI插件扩展为您提供了一种强大的解决方案,帮助您自定义序列化和反序列化类,轻松适应业务需求,而且无需复杂的代码修改。


这篇文章将带你深入了解如何运用OpenAPI插件扩展,为你的API提供个性化定制,从而提高效率,实现更多可能性。


适用版本

金蝶云·苍穹V5.0.018及以上


功能速览

场景一:反序列化入参


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


接下来,以保存操作API为例,介绍如何进行入参的反序列化。


图 1 保存操作API


步骤一:编写反序列化插件,类中需实现对应接口

操作

接口

重写方法

反序列化

kd.bos.openapi.api.plugin.ApiDeserializerPlugin

deserializer


该方法中,request即为还没反序列化的原入参,处理逻辑是将原Text/plain类型的入参反序列化为map,然后进行入参干预处理,最后返回这个map给OpenAPI进行处理。


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.equals(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.equals(MediaType.APPLICATION_XML)){
        //XML格式反序列化逻辑
        return ...;
      }else {
        return ...;
      }
    } catch (JsonProcessingException e) {
      throw new RuntimeException(e);
    }
  }
}


步骤二:注册并启用插件


图 2 注册插件

步骤三:测试API


可以看到,传Text文本时正常能正常解析入参并返回保存结果。


图 3 测试反序列化入参


场景二:序列化出参


在实际的业务场景中,标准接口的返回结果可能不满足实际需求,如用操作API查询某单据时,想再添加别的一些字段信息。或者想更改标准的返回日期格式或返回的数据结构信息等,那么此时我们可以编写序列化插件对出参进行个性化处理。


以查询操作API为例,序列化出参操作步骤如下:


图 4 查询操作API


步骤一:编写插件,重写serialize方法


操作

接口

重写方法

序列化

kd.bos.openapi.api.plugin.ApiSerializerPlugin

serialize


其中参数response为还没序列化的原出参,这里逻辑是取标准接口返回中的rows字段信息放到自定义的返回结构中,同时加上自定义的参数和修改返回的日期格式。


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import kd.bos.openapi.api.plugin.ApiSerializerPlugin;
import kd.bos.openapi.api.plugin.SerializerResult;
import kd.bos.openapi.api.result.ApiQueryResult;
import kd.bos.openapi.common.constant.MediaType;
import kd.bos.openapi.common.result.OpenApiResult;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class DemoApiSerializerPlugin implements ApiSerializerPlugin {
    private static final long serialVersionUID = 1747368553053757065L;
    @Override
    public SerializerResult serialize(Object response, String accept, String contentType) {
        if (contentType.equals(MediaType

还不会自定义OpenAPI出入参?快看这篇锦囊妙计!

当使用OpenAPI时,开发者常常面临一个难题:如何自定义API的输入和输出数据参数和格式,来满足特定业务场景的需求?如果你也曾经感到烦恼,...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信