同一个接口如何针对不同请求返回不同的字段

这个能力面向的场景:有些业务使用的是一个复杂的大接口,返回的VO中字段很多,但是不同调用方需要的字段可能是不一样的,

可能大多数字段在其他场景下并不需要。

解法一 拆分接口

这种解法过于理想,你把接口拆分开,还需要上游和你打配合,除非项目整体在搞大优化,不然和上游的沟通,排期,对接会花费很多精力。另外拆分后的接口需要返回不同的VO,也比较坑爹。

解法二 创建很多实体类

还有一种解法就是创建很多实体类,根据不同的场景将查询结果转换为不同的VO,这种解法太死板,如果上游忽然需要另一个字段,你还要吭哧吭哧来改对应VO,修改一个赋值,然后再来一次发布,十分沉重。

解法三 使用序列化过滤器

这种接法要求你要有一个配置中心,实在不行放在yaml文件里也可,这样灵活度受限,但还是比上一种好(但一般有这种需求的团队应该也是有配置中心的),只要在配置中心声明不同场景下的配置,在序列化过滤器中指定当前属性是否需要被write。

这种方式还要求在对应的VO上指定序列化过滤器。

@Configuration
public class CommonWebMvcConfigurer implements WebMvcConfigurer {

	// 获取配置的bean
    @Autowired
    private ApolloProperties apolloProperties;

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper objectMapper = new ObjectMapper();
        //忽略无法识别字段
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        //忽略空值
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        FilterProvider filterProvider = new SimpleFilterProvider().addFilter("myFilter",
            new MyPropertyFilter(apolloProperties));
        objectMapper.setFilterProvider(filterProvider);

        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(objectMapper);
        converters.add(converter);
    }

    public static class MyPropertyFilter extends SimpleBeanPropertyFilter {

        private ApolloProperties apolloProperties;

        public MyPropertyFilter(ApolloProperties apolloProperties) {
            this.apolloProperties = apolloProperties;
        }

        @Override
        protected boolean include(PropertyWriter writer) {
            String propertyName = writer.getFullName().getSimpleName();
            // 获取配置 当前请求对应的配置  ["id", "name"]
            Set<String> useProperty = apolloProperties.getConfig();
            return useProperty.contains(propertyName);
        }
    }

    @Data
    @JsonFilter("myFilter")
    public static class SimpleBeanVO {

        private String id;
        private String name;
        private String price;
    }

}

解法四 直接返回Map

配置还是这个配置,VO结果遍历一遍,仅对单个VO,遍历属性,如果属性在配置中,就放进map返回给前端,这个方法也可以,但是你遍历属性要用到反射吧,反射现在的性能比之前高了很多,但是注意上面的场景,本来字段就多,你性能就算高了很多,这个花销还是存在的,而且你返回map也要走序列化器,那把这个工作放在序列化器里是不是比较合理。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接口测试是针对于接口的功能、性能等方面进行测试的一种测试方式,而JSON是一种轻量级的数据交换格式,常用于前后端之间的数据传输。因此,接口测试中的JSON测试用例主要是围绕JSON数据的正确性、完整性、格式等方面进行验证。 首先,针对JSON数据的正确性,我们需要编写测试用例来验证接口返回JSON数据是否与预期一致。我们可以通过比对预期结果与接口返回结果中的JSON数据来判断是否正确。测试用例可以涵盖各种不同的场景,例如针对不同请求参数的验证、异常情况下的处理等。 其次,我们需要关注JSON数据的完整性。在接口测试中,我们需要确保接口返回JSON数据是完整的,例如是否包含了所有必需的字段和值。我们可以编写测试用例来验证接口返回JSON数据中是否缺少或多出了不应该存在的字段。 此外,我们还需要检查JSON数据的格式是否符合规范。在接口测试中,我们需要验证接口返回JSON数据是否符合指定的JSON格式要求。测试用例可以包括对JSON数据结构、数据类型、数据范围等方面的验证。 最后,我们还可以关注接口返回JSON数据在不同场景下的性能表现。例如,我们可以编写测试用例来验证接口返回JSON数据的响应时间、并发性能等。 总之,接口测试中的JSON测试用例主要是为了验证接口返回JSON数据的正确性、完整性和格式等方面。通过编写针对不同场景的测试用例,可以保证接口的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值