最近一直看这方面的东西,总结如下:

在后续会进行实例demo演示,本篇进行理论详解。

下篇相关博客:

Web Api 内部数据思考 和 利用http缓存优化 Api

API接口安全加强设计方法

一 什么是Web Api ?

web api 是指 “使用HTTP协议通过网络调用的API”。API是“Application Programming Interface”的缩写,是软件组件的外部接口。也就是说某个软件集合体,人们能了解它的外部功能,但并不知道(也无需知道)其内部的运作细节,为了从外部调用该功能,需要指定该软件集合体的调用规范等信息,而这样的规范就是API。—— web api的设计与开发一书解释

二 什么是API端点 ?

  端点是指用于访问API的URI,由不同的功能而拥有不同的端点。以获取用户信息为例,可以分配如下URI

https://api.example.com/v1/users/me

三 URL和URI有什么区别?

URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL则是具体的资源标识的方式。URL是一种URI。

四 端点的基本设计

1 容易记忆,URI包含的功能一目了然

A) 短小便于输入的URI

    简单易记,例如:

http://api.example.com/service/api/search

这个URI不好的地方在于:

  1)域名和路径都包含api,重复 。

  2)service 表示服务,似乎无关紧要

  可以简写为:

http://api.example.com/search

  当然,可以添加其他区别的路径名

B)可以读懂的URI

  例如:

http://api.example.com/sv/u

  sv和u是啥?service和user吗?

C)没有大小写混用的URI

   在web设计标准一书中,说的是尽量路径采用小写

http://api.example.com/USERS/12345

与下面对比

http://api.example.com/users/12345

  这方面见仁见智

D)修改方便的URI

  假设我们需要获取某种商品(item),例:

http://api.example.com/v1/items/123456  

  可以看到v1为版本号,items为商品,并且可以知道改变id,可以获取到其他商品

E)不会暴露服务器架构的URI

例如:

http://api.example.com/cgi-bin/get_user.php?user=100

这透露api是由php语言编写且以CGI的方式运行。这是多余的,对于外界来说,并不需要关心语言和运行方式。也增加了服务器受攻击的可能性

F)规则统一的URI

Tips:查询参数放于路径中:例:

http://api.example.com/v1/user/123:(id,name,desc,other)

五 登录与OAuth2.0

  官方网站:http://oauth.net/   http://oauth.net/2/

  权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.

  OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密的资源(如用户个人信息、照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。

(换句话说,假设带有用户注册功能的在线服务A,对外公开了api,你自己开发了在线服务B,便可以使用在线服务A的用户,A用户也无需注册,即可使用服务B)

  OAuth 2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。

OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

  新浪微博API目前也使用OAuth 2.0。

  在OAuth2.0的处理流程,主要分为以下四个步骤:

    1)得到授权码code

    2)获取access token

    3)通过access token,获取OpenID

    4)通过access token及OpenID调用API,获取用户授权信息

  上面是流程的大概四个步骤,流程图为:

【图片摘于网络】

  第一步:首先直接跳转至用户授权地址,即图示 Request User Url ,提示用户进行登录,并给予相关资源授权,得到唯一的Auth code,这里注意的是code只有10分钟的有效期;

  第二步:得到授权code后,这一步就是请求access token,通过 图示 Request access url ,生成得到数据Token;

  第三步:通过Access Token请求OpenID,OpenID是用户在此平台的唯一标识,通过图示 Request info url 请求,然后得到OpenID;

  第四步:通过第二步得到的数据Token、第三步得到的OpenID及相关API,进行请求,获取用户授权资源信息。

六  数据格式

  无疑,json是最流行的数据格式,其次是xml,同时还有jsonp【不推荐使用,最大的问题在于当服务器返回错误时无法正确应对】,那么如何指定返回数据格式呢?

  1)使用查询参数的方法,例:

http://api.example.com/v1/user?format = xml

  2)使用扩展名的方法,例:

http://api.example.com/v1/users.json

  但是此方法并不推荐,灵活性很低

  3)使用名为Accept的请求首部来指明所需的数据格式,例如:

GET /v1/users
Host : api.example.com
Accept : application/json

  既然第二种不推荐,那么可以第一种和第三种结合的方式设计api。

  未完待续。。。。。。

Web Api 端点设计 与 Oauth的更多相关文章

  1. Web API接口设计经验总结

    在Web API接口的开发过程中,我们可能会碰到各种各样的问题,我在前面两篇随笔<Web API应用架构在Winform混合框架中的应用(1)>.<Web API应用架构在Winfo ...

  2. Web API接口设计(学习)

    1.在接口定义中确定MVC的GET或者POST方式 由于我们整个Web API平台是基于MVC的基础上进行的API开发,因此整个Web API的接口,在定义的时候,一般需要显示来声明接口是[HttpG ...

  3. 微信小程序的Web API接口设计及常见接口实现

    微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们 ...

  4. Spring Boot web API接口设计之token、timestamp、sign

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/vbirdbest/article/details/80789817一:token 简介Token:访 ...

  5. WEB API 的设计与开发

  6. Web Api 内部数据思考 和 利用http缓存优化 Api

    在上篇<Web Api 端点设计 与 Oauth>后,接着我们思考Web Api 的内部数据: 其他文章:<API接口安全加强设计方法> 第一  实际使用应该返回怎样的数据 ? ...

  7. Web API核查表:设计、测试、发布API时需思考的43件事[转]

    Web API核查表:设计.测试.发布API时需思考的43件事   当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...

  8. 整合微信小程序的Web API接口层的架构设计

    在我前面有很多篇随笔介绍了Web API 接口层的架构设计,以及对微信公众号.企业号.小程序等模块的分类划分.例如在<C#开发微信门户及应用(43)--微信各个项目模块的定义和相互关系>介 ...

  9. RESTful Web Services中API的设计原则(转)

    当下前后端分离的设计已经是web app开发的标配,但是如何设计一个强壮,扩展性好,又规范的API呢 参考以下link,可以得到需要有益的启示.同时个人推荐一本书<web API的设计和开发&g ...

随机推荐

  1. sqlplus 方式连接 远程数据库

    方式一:简易连接,不用进行网络配置,其实就是tnsname.ora文件,但只支持oracle10G以上.命令:sqlplus 用户名/密码@ip地址[:端口]/service_name [as sys ...

  2. sqlserver: 使用While 示例

    declare @i intset @i = 1999while(@i<2009)begin declare @sql varchar(8000) set @sql = 'update    d ...

  3. Java的bitmap到C

    在很多情况下android程序员需用到c,bimap这个是一个java中的类,android底层有一个skbitmap类和其对应.先在我遇到了需要把java的bitmap传递到底层中进行一些操作.现在 ...

  4. 什么是Emit,什么是反射,二者区别到底是什么?(转)

    Emit的准确定义,我们看看微软给出的答案 System.Reflection.Emit 命名空间包含{ 允许编译器或工具发出元数据和发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘 ...

  5. springmvc 数据验证 hibernate-validator --->对象验证

    数据验证步骤: 1.测试环境的搭建: 2.验证器的注册 在springmvc.xml配置文件中加以下代码: 3.验证注解添加到对应实体类上 4.修改处理器 5.将验证失败信息写入到表单 index.j ...

  6. lda spark 代码官方文档

    http://spark.apache.org/docs/1.6.1/mllib-clustering.html#latent-dirichlet-allocation-lda http://spar ...

  7. 再谈C#编码规范

    编码规范是老生常谈的问题,现在再看代码规范可能不会再去在意变量,控件的命名方法等,而是更加关注代码的实用性. 首先我们要明白一下几点, 1.代码写出来除了让他跑起来还有个非常非常重要的作用是维护,因为 ...

  8. Android开发之获取系统所有进程信息。

    最近在做一个app,有一个进程管理模块用于管理系统中正在运行的进程,并且可以关闭进程进行加速手机的功能,基本把它实现了出来.界面的效果都是自己写的,虽然有BUG,但是基本上能满足需求,后期我会改进BU ...

  9. 理解UV贴图

    一.理解UV贴图UVs是驻留在多边形网格顶点上的两维纹理坐标点,它们定义了一个两维纹理坐标系统,称为UV纹理空间,这个空间用U和V两个字母定义坐标轴.用于确定如何将一个纹理图像放置在三维的模型表面.本 ...

  10. (K)ubuntu上将分区格式化成NTFS格式

    新买了硬盘,装系统时,为Windows预留了几个分区,由于没有其他选择,因此将分区格式化成了fat32格式.装完系统后,总是很纠结,想把这些分区格式化成NTFS格式. google了一下,从这个网址( ...