下面小编就为大家分享一篇 PHP 服务器端 API 原理及示例讲解(接口开发), 具有很好的参考价值, 希望对大家有所帮助.
相信大家都做过 PHP 请求 API 接口获取数据, 比如淘宝 API, 微信公众平台, 天气查询, 快递查询等, 有的需要参照接口文档根据签名算法构造 sign(签名), 或者设置 token, 然后通过 curl 发送 POST 请求带上参数, 获得返回数据, 一般是 json 或者 xml 格式.
但是现在的情况反过来了, 我们要开发 PHP 服务器端的 API 接口, 也就是别人请求我们, 我们验证请求合法性, 并查询数据返回.
这种情况其实在手机 app 开发中用到, 手机 APP 应用往往需要请求 PHP 接口获取数据, 不过这个请求一般是不用经过验证的, 根据不同的功能请求不同的 url, 通常也是 get 方式传参数直接获取数据.
本文简单讲讲服务器端验证请求合法性的方法, 和接收参数的方式.
简单的 get 请求如: http://www.demo.com/api/get_cat?id=2, 请求这个网址会返回一些数据, 无论是谁用什么编程语言请求都能得到数据.
那么在需要验证合法性的情况下这样显然是不行的. 所以需要一个秘钥, 这个时候往往用 POST 方式请求 url.
比如传递的参数中有个签名 sign, 值是 98888, 当然生成 sign 的方式很多而且不可能这么简单, 这里只是随便写, 那么服务器端接收到 sign 是 98888, 假如我们约定 98888 就是合法的, 这个时候判断 sign 是否为 98888 就可以验证这是合法请求了.
但是这样也太简单了, 一下子就被破解了, 设置这个 sign 就毫无意义了. 所以要有一个生成 sign 的规则, 请求的时候根据这个规则生成 sign 传参, 服务器端接收的时候也根据这个规则生成 sign, 如果生成的 sign 一致, 表明这是合法请求. 每次请求都会带上 sign 进行验证.
还有一种验证叫 token, 第一次请求的时候验证 token, 在一定时间内不用再次验证. 这要分两步, 第一步先请求获取 token 的接口得到 token, 第二步才是请求具体接口的功能, 需要带上 token 传参. 由于第一次请求 token 的时候, 服务器端先把 token 存储起来了再返回的, 所以后面的请求判断传过来的 token 是否存在就可以验证了.
许多接口开发都同时使用两者方式保证私密和安全.
还有一点, 发送 POST 请求往往使用 PHP 的 CURL 模块, 比如对方通过 curl 发送 POST 请求, curl_setopt(ch,CURLOPT P OSTFIELDS,post_string), 这里 $post_string 是传 PHP 数组的形式好, 还是 json 格式呢?
如果是传 PHP 数组, 我这边直接 $_POST['xx']获取参数, 如果是传的 json 格式, 我这边好像要用 file_get_contents('php://input', 'r')获取传过来的 json 数据, 然后解析 json 得到参数.
什么情况下用第二种?
这个曾经在网上提问过, 看看大家怎么回答:
对 PHP 来说 JSON 和数组有时候真的只是一行代码的区别, 如果我写可能直接回用第一种.
我觉得你想你的代码简洁一点可以用第二种, 我记得 weixin 的 php sdk 好像类似就是第二种(当然那是 xml 格式)
还有如果对方使用面向对象直接序列化出来的 json 的话, 用 json 会让他的代码更简洁一点.
第一种做法, 是传输的是 form 表单 POST 协议, PHP 会把 PHP 数组变成 HTTP 表单的格式, 跨语言通用, 但是这种并不是主流的 API 协议, 而更像是模拟提交表单.
绝大多数 API 协议会用 JSON POST,
第二种做法, 即在 HTTP Body 里放 JSON 数据. 也是跨语言的, 但作为 API 更友好.
第一种方法, 直接 PHP curl, 如果数据内容没处理好, 数组 value 里传了 @/xxx/xxx 这样的内容, curl 会把服务器上的本地文件传出去, 注意防范.
x-www-form-urlencoded 是 RFC 标准, 没什么不兼容的, 岂止跨语言, 还跨越时空. JSON 这种是近几年想出来的, 不是标准, 用着方便而已.
来源: http://server.51cto.com/Solution-578216.htm