API对接之模板方法

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

API对接之模板方法

定义

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

一个栗子

引用菜鸟教程的一个例子

父类定义一个步骤/模板,一般会有默认的步骤实现,只留一个抽象方法留到实现类中实现。

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();
 
   //模板
   public final void play(){
 
      //初始化游戏
      initialize();
 
      //开始游戏
      startPlay();
 
      //结束游戏
      endPlay();
   }
}

子类进行具体的实现

public class Football extends Game {
 
   @Override
   void endPlay() {
      System.out.println("Football Game Finished!");
   }
 
   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }
 
   @Override
   void startPlay() {
      System.out.println("Football Game Started. Enjoy the game!");
   }
}
public static void main(String[] args) {
      Game game = new Football();
      game.play();      
   }

spring中的模板

spring框架中也提供了一些模板如JdbcTemplate、RestTemplate、RestTemplate。

JdbcTemplate 只需传入要执行的方法ConnectionCallback,其他工作交给模板处理。

// 构造函数注入了DataSource
public JdbcTemplate(DataSource dataSource) {
  setDataSource(dataSource);
  afterPropertiesSet();
}

/**
* 模板步骤 
* 1. 打开链接 Connection
* 2. 执行action (sql)
* 3. 释放链接 releaseConnection
**/
public <T> T execute(ConnectionCallback<T> action) throws DataAccessException {
        Assert.notNull(action, "Callback object must not be null");

        Connection con = DataSourceUtils.getConnection(obtainDataSource());
        try {
            // Create close-suppressing Connection proxy, also preparing returned Statements.
            Connection conToUse = createConnectionProxy(con);
            return action.doInConnection(conToUse);
        }
        catch (SQLException ex) {
            // Release Connection early, to avoid potential connection pool deadlock
            // in the case when the exception translator hasn't been initialized yet.
            String sql = getSql(action);
            DataSourceUtils.releaseConnection(con, getDataSource());
            con = null;
            throw translateException("ConnectionCallback", sql, ex);
        }
        finally {
            DataSourceUtils.releaseConnection(con, getDataSource());
        }
    }

redisTemplate 也类似,处理的业务逻辑更多些

  1. 获取链接
  2. 执行action
  3. 关闭资源、断开链接
public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) {

 Assert.isTrue(initialized, "template not initialized; call afterPropertiesSet() before using it");
 Assert.notNull(action, "Callback object must not be null");

 RedisConnectionFactory factory = getRequiredConnectionFactory();
 RedisConnection conn = null;
 try {

  if (enableTransactionSupport) {
   // only bind resources in case of potential transaction synchronization
   conn = RedisConnectionUtils.bindConnection(factory, enableTransactionSupport);
  } else {
   conn = RedisConnectionUtils.getConnection(factory);
  }

  boolean existingConnection = TransactionSynchronizationManager.hasResource(factory);

  RedisConnection connToUse = preProcessConnection(conn, existingConnection);

  boolean pipelineStatus = connToUse.isPipelined();
  if (pipeline && !pipelineStatus) {
   connToUse.openPipeline();
  }

  RedisConnection connToExpose = (exposeConnection ? connToUse : createRedisConnectionProxy(connToUse));
  T result = action.doInRedis(connToExpose);

  // close pipeline
  if (pipeline && !pipelineStatus) {
   connToUse.closePipeline();
  }

  // TODO: any other connection processing?
  return postProcessResult(result, connToUse, existingConnection);
 } finally {
  RedisConnectionUtils.releaseConnection(conn, factory, enableTransactionSupport);
 }
}

redisTemplate.opsForValue().get(key) 也是调用了template的execute方法。

public V get(Object key) {

 return execute(new ValueDeserializingRedisCallback(key) {

  @Override
  protected byte[] inRedis(byte[] rawKey, RedisConnection connection) {
   return connection.get(rawKey);
  }
 }, true);
}

API对接之模板方法

api对接通常需要 加入时间戳,根据一定规则进行签名

XxxApiTemplate

public  class XxxApiTemplate {

  private String key;
  private String secret;

  @Autowired
  private RestTemplate restTemplate;

  private HttpClient httpClient;

  public XxxApiTemplate () {
  }

  public XxxApiTemplate (String key, String secret) {
    this.key = key;
    this.secret = secret;
  }

  public String get(String url, Map<String,String> params){
    // params 加入时间戳
    // sign 根据key、secret进行签名(MD5/AES)
    // 处理url拼接参数
    // 其他工作 如日志等
    // 进行请求 httpClient、restTemplate
    return restTemplate.getForObject(url,String.class);
  }

  public String post(String url, Map<String,String> params){
    // 与get方法类似,处理参数方式不同
    Object request = null;
    return restTemplate.postForObject(url,request,String.class);
  }

  public void execute(CallBackAction action){

  }
}
  

至此模板方法介绍到这。 若你有收获,便是我最大的快乐。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
机器人 API
Eolink神技之三、钉钉API对接
Eolink神技之三、钉钉API对接
99 0
|
存储 供应链 前端开发
最近在对接电商供应链,说说开放平台API接口
由于商家的商品、客户、价格、库存、订单等信息都有手动同步和自动同步两种模式,当两种模式同时存在并进行的同时,可能会导致数据比较乱,而且不方便,如:由于库存不足,页面无法进行下单的操作。而此时商家需要进行负卖,那边这个时候需要手动修改库存,但是修改完之后,库存很快会被同步系统传过来的新库存数据给覆盖。 为了解决以上的问题,我们需要根据不同的功能模块分别做一个开关,即针对某个功能设置是否开启自动同步。如刚刚那个例子,如果此时该商品需要临时修改库存并维持一段时间(保证客户有足够的时间下单付款),可以暂时关闭库存同步服务。
|
3月前
|
开发框架 缓存 前端开发
基于SqlSugar的开发框架循序渐进介绍(23)-- Winform端管理系统中平滑增加对Web API对接的需求
基于SqlSugar的开发框架循序渐进介绍(23)-- Winform端管理系统中平滑增加对Web API对接的需求
|
4天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
26天前
|
监控 安全 测试技术
如何确保API对接过程中的数据安全?
确保API对接过程中的数据安全至关重要。最佳实践包括:使用HTTPS协议、强化身份验证和授权、数据加密、输入验证、访问控制、限流限速、日志记录和监控、安全测试、数据脱敏、错误处理、API网关、Web应用程序防火墙(WAF)、审计和合规性。这些措施能有效提升API的安全性,保护数据免受恶意攻击和泄露风险。
|
1月前
|
API 定位技术
api接口如何对接?(带你了解api接口的相关知识)
API接口是在产品和研发领域广泛应用的专业术语,主要用于公司内部系统衔接及公司间合作。本文将详细讲解API接口的概念、必要性及其核心要素。首先介绍API接口的基本原理与应用场景,随后阐述其重要性,最后解析API接口的核心组成部分,帮助读者深入理解API接口的工作机制。适合产品小白和求职者阅读,提升专业知识。
|
2月前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
94 11
|
4月前
|
前端开发 JavaScript API
告别‘老司机’时代,AJAX与Fetch API让你的前端与Python后端无缝对接!
【7月更文挑战第14天】前端与后端交互的关键技术是AJAX和Fetch API。AJAX允许不刷新页面更新内容,而Fetch API提供了Promise基
59 0
|
6月前
|
SQL 缓存 测试技术
API接口对接中需要注意的问题(4)
有几个关键的问题需要注意,它们涉及安全性、性能、数据一致性和错误处理等方面
|
6月前
|
API 开发工具 数据安全/隐私保护
API接口的对接流程和注意事项(淘宝商品详情店铺)
随着互联网技术的发展和应用的普及,API接口已经成为不同系统、不同应用之间进行交互和数据交换的重要方式。API接口使得不同的系统能够互相调用对方的功能,提高了系统的灵活性和扩展性。但是,在进行API接口对接的过程中,需要注意一些流程和事项,以确保对接的顺利进行和系统的稳定运行。

热门文章

最新文章