Web Api 端点设计 与 Oauth
最近一直看这方面的东西,总结如下:
在后续会进行实例demo演示,本篇进行理论详解。
下篇相关博客:
《Web Api 内部数据思考 和 利用http缓存优化 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的更多相关文章
- Web API接口设计经验总结
在Web API接口的开发过程中,我们可能会碰到各种各样的问题,我在前面两篇随笔<Web API应用架构在Winform混合框架中的应用(1)>.<Web API应用架构在Winfo ...
- Web API接口设计(学习)
1.在接口定义中确定MVC的GET或者POST方式 由于我们整个Web API平台是基于MVC的基础上进行的API开发,因此整个Web API的接口,在定义的时候,一般需要显示来声明接口是[HttpG ...
- 微信小程序的Web API接口设计及常见接口实现
微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们 ...
- Spring Boot web API接口设计之token、timestamp、sign
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/vbirdbest/article/details/80789817一:token 简介Token:访 ...
- WEB API 的设计与开发
- Web Api 内部数据思考 和 利用http缓存优化 Api
在上篇<Web Api 端点设计 与 Oauth>后,接着我们思考Web Api 的内部数据: 其他文章:<API接口安全加强设计方法> 第一 实际使用应该返回怎样的数据 ? ...
- Web API核查表:设计、测试、发布API时需思考的43件事[转]
Web API核查表:设计.测试.发布API时需思考的43件事 当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...
- 整合微信小程序的Web API接口层的架构设计
在我前面有很多篇随笔介绍了Web API 接口层的架构设计,以及对微信公众号.企业号.小程序等模块的分类划分.例如在<C#开发微信门户及应用(43)--微信各个项目模块的定义和相互关系>介 ...
- RESTful Web Services中API的设计原则(转)
当下前后端分离的设计已经是web app开发的标配,但是如何设计一个强壮,扩展性好,又规范的API呢 参考以下link,可以得到需要有益的启示.同时个人推荐一本书<web API的设计和开发&g ...
随机推荐
- MyEclipse8.6启动后提示内存不足的解决方案(亲测,完美解决)
转自:http://www.bubuko.com/infodetail-1625857.html 最近可能由于公司项目大了,启动MyEclipse后经常提示内存不足的警告框,如下: 其实点击close ...
- plsql 中文乱码
plsql 中文乱码, 中文还是用ZHS16GBK insert into tt(id,name) values('2','张三'); select * from nls_database_param ...
- spring拾遗(一)——@Value注入static属性
一般情况的下的@Value是用在非静态方法上的,如下: import org.springframework.beans.factory.annotation.Value; import org.sp ...
- python之private variable
[python之private variable] Since there is a valid use-case for class-private members (namely to avoid ...
- 进程组&Session
[进程组] 1. getpgrp(), getpgid(0) 可获取进程组id, 进程组长的pid等于pgid. 如果进程组长exit, 则进程组依旧存在, 组内其它进程的组ID仍然是之前的ID, 即 ...
- write()和print()还有<%= %>的细微区别
1.首先介绍write()和print()方法的区别: (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等 (2).print():可以将各种类型(包括Object)的数据通过默 ...
- 4-在windon10上mysql安装与图形化管理
安装及可能遇到的问题: 1.windows10上安装mysql(详细步骤 https://blog.csdn.net/zhouzezhou/article/details/52446608 2. 在 ...
- lombok 介绍及基本使用方法
Lomboz是一个基于LGPL的开源J2EE综合开发环境的Eclipse插件,对编码,发布,测试,以及debug等各个软件开发的生命周期提供支持,支持JSP,EJB等.Lomboz是Eclipse的一 ...
- C语言中的序列点和副作用
参考: http://www.2cto.com/kf/201210/161225.html
- mysql常见错误/usr/local/mysql/bin/mysqld: [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
出现这种情况多数是找不到data目录,还有就是对data目录没有写入权限.