基础通用参数:

  1. token* 用户token,由后端生成并返回给前端,是用户身份的唯一表示,需要获取用户ID的接口,必须传入该参数
  2. api_token* 前后端接口验证规则
  3. client_id* client_id:1 客户端表示
  4. device_token* 设备唯一标示码

参数解释: apiRoute:api路由 data: 请求参数

前端

采用flyio

一个支持所有JavaScript运行环境的基于Promise的、支持请求转发、强大的http请求库。可以让您在多个端上尽可能大限度的实现代码复用。

  1. // 文件路径:~/api/config.js
  2. tokendevice_token写在request.body
  3. fly.interceptors.request.use(request => {
  4. request.body.token = uni.getStorageSync('token')
  5. request.body.device_token = uni.getStorageSync('devicetoken')
  6. return request
  7. })
  8. // post方法封装
  9. api_token url+当前格式化日期入2020-01-20+前端约定字段baseAppoint 再经过md5加密生成
  10. let api_token = null;
  11. function post(url, data = {}) {
  12. api_token = md5(
  13. `${url}${utils.formartDate()}${baseAppoint}`
  14. );
  15. return request(
  16. url,
  17. {
  18. ...data,
  19. api_token,
  20. client_id: 1,
  21. },
  22. "POST"
  23. );
  24. }
  25. // 配置接口路 例:
  26. export default{
  27. getreadprofile(data) {
  28. return post(apiRoute, data);
  29. },
  30. getAddressdel(data) {
  31. return post(apiRoute, data);
  32. },
  33. ....
  34. }

api调用

  1. // 先在main.js中做全局挂载
  2. import api from "./api";
  3. Vue.prototype.$http = api; //全局挂载api
  4. // 具体引用
  5. this.$http.getreadprofile(data).then(res=>{
  6. console.log(res)
  7. // res:返回接口
  8. )

nvue中请求

  1. utils/nvueCommon.js 封装了在nvue中的请求方法 http()
  2. http(path = "", params = {}, method = "POST") {
  3. const token = uni.getStorageSync("token");
  4. return new Promise((resolve, reject) => {
  5. uni.request({
  6. url: `${this.baseUrl}/${path}?t=${new Date().getTime()}`,
  7. method: method,
  8. data: {
  9. api_token: md5(
  10. `${path}${this.formartDate()}${SECRETKEY}`
  11. ),
  12. client_id: 1,
  13. token,
  14. ...params,
  15. },
  16. success: (res) => {
  17. resolve(res);
  18. },
  19. fail: (err) => {
  20. reject(err);
  21. },
  22. });
  23. });
  24. },
  25. //调用方法:
  26. //
  27. this.http(apiRoute, data).then(res => {
  28. console.log(res)
  29. // res:返回接口
  30. })

后端

接口验证方法:/application/apicloud/model/Common.php

  1. /*
  2. * 接口验证
  3. * @param $needUserToken 是否验证用户token,默认1:需要验证,0不验证
  4. */
  5. public function apivalidate($needUserToken = 1)
  6. {
  7. $clientId = input('post.client_id');
  8. $apiToken = input('post.api_token');
  9. if (!$clientId || !$apiToken) {
  10. return array('status' => 400, 'mess' => '接·口请求验证失败');
  11. }
  12. $module = request()->module();
  13. $controller = request()->controller();
  14. $action = request()->action(true);
  15. $secretstr = $module . '/' . $controller . '/' . $action;
  16. $clientSecret = Db::name('secret')->where('id', $clientId)->value('client_secret');
  17. if (!$clientSecret) {
  18. return array('status' => 400, 'mess' => '接口·请求验证失败');
  19. }
  20. $apiTokenServer = md5($secretstr . date('Y-m-d', time()) . $clientSecret);
  21. if ($apiToken != $apiTokenServer) {
  22. return array('status' => 400, 'mess' => '接口请·求验证失败');
  23. }
  24. //验证个人token
  25. if ($needUserToken) {
  26. $token = input('post.token');
  27. if (empty($token)) {
  28. return array('status' => 400, 'mess' => '请先登录');
  29. }
  30. //设备token
  31. $deviceToken = input('post.device_token');
  32. $rxins = Db::name('rxin')->where('token', $token)->find();
  33. if (empty($rxins)) {
  34. return array('status' => 400, 'mess' => '接口请求·验证失败');
  35. }
  36. $userInfo = Db::name('member')->where('id', $rxins['user_id'])->where('checked', 1)->field('id,appinfo_code')->find();
  37. if (!$userInfo) {
  38. return array('status' => 400, 'mess' => '接口请求验·证失败');
  39. }
  40. //查看当前用户表中存储的设备clientid值与传递的device_token值是否一致,不一致提示在其他设备登录,请重新登录
  41. if ($deviceToken && $deviceToken != $userInfo['appinfo_code']) {
  42. return array('status' => 400, 'mess' => '账号已在其他设备上登录,请重新登录');
  43. } else {
  44. return array('status' => 200, 'mess' => '接口请求验证成功', 'user_id' => $userInfo['id']);
  45. }
  46. } else {
  47. return array('status' => 200, 'mess' => '接口请求验证成功');
  48. }
  49. }

调用方式:

继承Common控制器,如:class Login extends Common 在接口开始位置加入checkToken验证方法

不需要获取$userId的情况

  1. $tokenRes = $this->checkToken(0); // 传入0,代表不需要获取$user_id
  2. if($tokenRes['status'] == 400){ // 400返回错误描述
  3. datamsg(LOSE,$tokenRes['mess'],$tokenRes['data']);
  4. }

需要获取$userId的情况

  1. $tokenRes = $this->checkToken();
  2. if($tokenRes['status'] == 400){ // 400返回错误描述
  3. datamsg(LOSE,$tokenRes['mess'],$tokenRes['data']);
  4. }else{ // 成功则返回$user_id
  5. $user_id = $tokenRes['user_id'];
  6. }