专栏首页TIGERB的技术博客我所理解的接口设计

我所理解的接口设计

前言

自己做接口开发的时间也算不短了(三年),想写这篇文章其实差不多已经有一年多的时间了。我将从下面的方向来对我所理解的接口设计做个总结:

接口参数定义 -> 接口版本化的问题 -> 接口的安全性 -> 接口的代码设计 -> 接口的可读性 -> 接口文档 -> 我遇到的坑

接口参数定义

接口设计中往可以抽象出一些新的公共参数,从事了近三年的接口开发工作中,我目前能想到了一些较为常见的公共接口参数如下:

公共参数

含意

定义该参数的意义

timestamp

毫秒级时间戳

1.客户端的请求时间标示 2.后端可以做请求过期验证 3.该参数参与签名算法增加签名的唯一性

app_key

签名公钥

签名算法的公钥,后端通过公钥可以得到对应的私钥

sign

接口签名

通过请求的参数和定义好的签名算法生成接口签名,作用防止中间人篡改请求参数

did

设备ID

设备的唯一标示,生成规则例如android的mac地址的md5和ios曾今udid(目前无法获取)的md5, 1:数据收集 2.便于问题追踪 3.消息推送标示

接口版本化的问题

接口设计中有个算是历史上的难题 -> 接口版本化。曾经也去调研了很多关于接口版本化的资料和设计,最后我得到的结论大致如下:

接口的安全性

接口的设计肯定绕不开安全这两个字,为了达到尽可能的安全,我们需要尽可能的增加被攻击的难度,以下是我了解和使用到的一些常见的手段去增加接口的安全性(https这里就不讨论了):

过期验证/签名验证/重放攻击/限流/转义

伪代码如下:

接口的代码设计 -> 解耦业务 即插即用

这个过程的关键字:抽象成类 前置中间件 注入

接着就是我们代码设计的层面了,如何抽象公共的部分与业务代码解耦。一般写法, 定义个全局函数,然后每个接口开始时调用该函数:

二般写法, 定义个父类方法,然后每个接口类继承该接口,构造函数调用改方法,其实和上面的换汤不换药:

重点来了,我提倡的第三般写法,对象链和前置中间件:

接口的可读性

关于可读性的不得不提到的就是RESTFUL,这里我就不讨论RESTFUL,大家可以自行补充相关知识。关于接口设计可读性的我的一些思考:

接口文档

好的接口文档就是生产力, swagger + api blueprint 自行google吧?

我遇到的坑

这里遇到的一个比较大的坑就是http协议历史遗留的bug:

不区分url里的空格 和加号➕

带来的问题就是urldecode会把参数里的+号转为空格,所以这种场景的就得使用rawurldecode防止+转成空格。比如做接口的参数校验的时候~

本文分享自微信公众号 - TIGERB的技术博客(tigerbcode),作者:TIGERB@小米科技

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于开发流的一点思考

    突然想聊聊开发流的东西,可能在一个新的环境下对之前的整个开发流程有了些思考,思考什么?

    用户1093396
  • 面向对象的设计过程

    再接着,一个业务逻辑(拆成多个类方法)从头写到尾,也许、可能、貌似、猜测大多数人停留到了这个阶段。

    用户1093396
  • 从0到1优雅的实现PHP多进程管理

    在我们实际的业务场景中(PHP技术栈),我们可能需要定时或者近乎实时的执行一些业务逻辑,简单的我们可以使用unix系统自带的crontab实现定时任务,但是对于...

    用户1093396
  • 接口以及 LeetCode 每日一题

    接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心类内方法的实现细节,只是规定这批类里面必须提供某些方法。所以接口体现的是规范和实现分...

    Carlos Ouyang
  • 接口测试是什么?如何测试?

    接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点,定义特定的交互点,然后通过这些交互点来,通过一些特殊的规则也就是协议,来进行数据之间的交互。

    小老鼠
  • [日常] 编写HTTP接口文档

    一、什么是接口文档? 在项目开发中,web项目的前后端分离开发,APP开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到...

    陶士涵
  • 怎么做接口测试?

    之前有在网上看过免费的公开课,发现最重要的一部分,怎么做简单的接口测试被一笔带过了。下面就是简单的介绍接口测试是怎么做的。

    清菡
  • Jtro的技术分享:c#的接口使用

    接口的特征: 1.接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员 2.不能直接实例化接口 3.接口可以包含时间事件、索引器、方法和属...

    LittleU
  • 一分钟了解“好”接口的设计与实现

    一、好接口的特性 易读 易用,难于误用 功能独立 容易扩展 二、好接口设计的基本原则 只做并做好一件事 函数名自解释 不恰当的函数名,往往是不恰当设计的征...

    架构师之路
  • 微信JSSDK那些事

    好长时间没对微信的H5进行开发,不过感觉微信基本已经废弃了JSSDK的更新,把更多的精力向小程序那边转移。不过刚好要维护一个以前写的微信H5所以重新拿了起来,如...

    谭广健

扫码关注云+社区

领取腾讯云代金券