数据api接口的要点
因为最近面试反馈被问到了接口,所以在此总结接口涉及到的内容。
在工作中、接口涉及到编写app接口、因为编写app接口涉及到Java(安卓app)、Object C(IOSapp)与php后端的数据交换、所以编写app接口的核心数据交换格式是JSON。
编写app接口还有一点难点是保持已登录的用户的状态、因为app程序和浏览器不同的一点是、app默认是不支持cookie、所以默认app无法保持登录状态、所以常见的有以下三种解决方式
app在发送请求时、每次请求都模仿浏览器携带cookie,在cookie中包含session_id
app端登录成功后、php服务器端为登录的用户生成一个唯一的随机字符串、并返回给app、app在后面的请求里都携带上这个随机字符串、服务器通过这个随机字符串寻找对应的用户。
其它的基于唯一字符串的验证方式:比如JWT https://jwt.io/
除了app接口、还有不需要用户和用户状态保持的接口、比如支付宝的支付、没有状态的保持、只需要保证和接口通信的安全性。支付宝采用的是非对称加密和使用https协议进行数据传输、避免中间人攻击。
app接口设计要点
app接口设计包含以下4点
接口的作用
接口的地址
接口的参数、参数通常是post请求携带payload方式传递的json字符串、需要通过file_get_contents('php://input')进行接收、当然也可以模拟普通的html表单进行提交、在php中使用$_POST接收。
接口的返回值、通常会返回一个状态码表示接口是否成功执行
{
code:0,
message: "success",
data: { key1: value1, key2: value2, ... }
}
其中的code表示状态码、状态码举例、其中为0的状态码表示成功、其它均表示错误:
0:成功
100:请求错误
101:缺少appKey
102:缺少签名
103:缺少参数
200:服务器出错
201:服务不可用
202:服务器正在重启
其中的message表示消息、成功、表示成功的消息、失败、返回失败的消息、这个消息一般用于直接显示给用户。
还有的接口简化了状态码的设计、只返回成功或者失败的状态、所以、状态由true和false表示,true表示接口执行成功、false表示错误。
还有的直接使用http状态码作为接口的状态码返回给客户端。
接口的安全性
我们的接口暴露在互联网上、所以存在有人恶意使用程序进行调用、程序可以以极快的速度请求我们的接口、造成我们的接口无法服务其它正常用户、所以针对这个问题、可以对一个ip的调用次数在单位时间内进行限制、比如一个每分钟只允许60次请求、超过60次即认为非法请求、后面的请求拒绝提供服务。接口请求的次数可以保存在redis、memcache等高速缓存中、从而不影响接口的性能。
同时为了禁止非授权用户调用我们的接口、可以要求需要调用接口的第三方在我们的平台上进行注册、注册成功后、我们分配给一个固定的唯一的随机字符串、要求用户请求时必须携带此参数、并在我们的接口里进行校验、不匹配直接不提供服务。比如有道接口,百度地图接口
Restful接口
restful接口的要点就是利用请求动词(get,post)表示出接口调用方的意图(获取、删除、还是保存数据)
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。(客户端提供资源的信息)
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
其中最常用的是前面5个请求动词、分别对应增删改查。其余用法和普通api没有区别。
接口调试工具
chrome扩展postman:https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=zh-CN
抓包工具fiddler:http://www.telerik.com/fiddler
php请求第三方接口
可以使用file_get_contents()默认以get方式请求、但是在实际开发中、为了增强对请求过程的控制、一般使用curl进行发起请求。
使用curl发起post请求
function curl_post(\(data, \)url, \(headers = array())
{
\)ch = curl_init();
\(res= curl_setopt (\)ch, CURLOPT_URL, \(url);
curl_setopt(\)ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt(\(ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt(\)ch, CURLOPT_HEADER, 0);
curl_setopt(\(ch, CURLOPT_POST, 1);
curl_setopt(\)ch, CURLOPT_POSTFIELDS, \(data);
curl_setopt(\)ch, CURLOPT_RETURNTRANSFER, 1);
\(result = curl_exec(\)ch);
curl_close(\(ch);
if (\)result == NULL) {
return 0;
}
return $result;
}
使用curl发起get请求
function curl_get(\(data, \)url, \(headers = array())
{
\)ch = curl_init();
\(res= curl_setopt (\)ch, CURLOPT_URL, \(url);
curl_setopt(\)ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt(\(ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt(\)ch, CURLOPT_HEADER, 0);
curl_setopt(\(ch, CURLOPT_POSTFIELDS, \)data);
curl_setopt(\(ch, CURLOPT_RETURNTRANSFER, 1);
\)result = curl_exec(\(ch);
curl_close(\)ch);
if (\(result == NULL) {
return 0;
}
return \)result;
}
第三方接口一般返回json字符串、我们对json字符串使用json_decode进行处理成php的对象或数组、就可以使用php操作变量的方式对返回的字符串进行处理。
友盟数据接口的使用方式
授权接口
\(url = 'http://api.umeng.com/authorize' ;
\)data = 'email=你的邮箱&password=你的密码';
echo curl_post(\(data, \)url);
获取app基本数据的接口
\(url = "http://api.umeng.com/apps/base_data";
\)data = '';
\(headers = array(
'Authorization: Basic 你的auth_token'
);
echo curl_get(\)data, \(url, \)headers);
参考资料
Copyright © 2015 Theme used GitHub CSS. 访问人/ 次