现在非常流行api的开发,那么开发api,传递请求的时候,需要注意什么呢?
今天我们就来看一看:
首先需要知道,api 通过 ajax 在网络中进行传输,数据安全是非常重要的。
开发api需要解决的问题一般有哪些呢?
1、跨域问题
什么是跨域:简单的说,在两个域名不同的情况下访问资源就属跨域,这个情况在接口中最常遇见。
跨域问题这里不做过多介绍,如果需要详细了解,请访问:
if (isAjax()) { header('Access-Control-Allow-Methods: GET, POST'); header('Access-Control-Allow-Headers: X-Requested-With, Uni-Source, X-Access-Token'); $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '*'; if (ENVIRONMENT !== 'development') { //检查跨域列表 $this->isCors($origin) || $origin = NULL; } if ($origin) { header('Access-Control-Allow-Origin: ' . $origin); $origin === '*' || header('Access-Control-Allow-Credentials: true'); //withCredentials } if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { header('Access-Control-Max-Age: 86400'); die; } } function isAjax($method = NULL) { return ($method ? $_SERVER['REQUEST_METHOD'] === strtoupper($method) : TRUE) && ( isset($_SERVER['HTTP_ORIGIN'], $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) //OPTIONS || isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest' //JQuery || isset($_SERVER['HTTP_ACCEPT']) && strpos(strtolower($_SERVER['HTTP_ACCEPT']), 'application/json') !== FALSE //axios || isset($_GET[VAR_PREFIX . 'ajax']) //URL ); } //其实核心代码是这里: header('Access-Control-Max-Age: 86400'); header('Access-Control-Allow-Origin: *'); //如果只是允许一个域名,可以指定域名 header('Access-Control-Allow-Methods: GET, POST'); header('Access-Control-Allow-Headers: Uni-Source, X-Access-Token');
通过上边的设置就能跨域请求了。
2、传递header头
简单请求:
同时满足以下需求,则为简单需求
访问方法仅限于:post get head 中的一种
访问携带的header头必须是:Accept 、Accept-Language、Content-Language、Last-Event-Id、Content-type 这几个header头
Content-type:application/x-www-urlcoded、text/plain 、multipart/form-data
同时满足以上这两种需求,则为简单需求。
但是
但是这无法满足我们日常的业务需求,因此必须添加header头上添加我们自己业务的需求,
比如说:Content-tpye:application/json;charset=utf-8
修改了header头的值
再比如说,添加一个header头
x-access-token= AES 加密后的字符串、RSA非对称加密的字符串、DES加密字符串
如果加上这里的一种就属于复杂请求。
复杂请求时,浏览器会自动发起 options 请求,判断是否可以访问。
非简单请求(复杂请求):
很简单,不满足上边条件的为非简单请求,为非简单请求,会发起options请求。
3、数据安全
数据传输过程中,数据安全是需要进行加减密的,那么这是如何做的呢?
AES 高级加密标准 是替代DES的一种加密方式,安全没有非对称加密 安全系数高。
DES
这两种加密方式其实都是基于 openssl 进行加减密的,可以归类为一种,属于对称加密
http://php.net/manual/zh/function.openssl-encrypt.php
http://php.net/manual/zh/function.openssl-get-cipher-methods.php
两种加密方式的说明。
RSA 非对称加密
非对称加密,需要一个公钥和私钥,那么这两种钥匙是如何生成的?请看: 公钥与钥匙生成方式
以上是加密方式的几种介绍。
现在看看系统及一些设计规范:
报文头标准:
加密方式:
业务接口数据加密方式为RSA非对称加密!
通讯方式:
所有接口通讯方式使用HTTP POST请求,请求头部携带消息规范见报文头标准。
请求体数据格式:
接口中业务数据通过http 请求POST请求传输到服务端,服务端获取httpBody中加密的请求数据,进行解析、校验、处理、结果返回。
加密展示:
示例:
加密前:
content 中数据加密前明文JSON串:{"qianbaoId":"1021312.00","realNameStatus":"0","remark":"test"}
加密后:
{"content":"eIhOCkGlPbU/4zVf+kozOq1uahGUEtJk1gowbkqSr/aJeQRsYBM2+AwiceEoWpkvddz6KRQPbMSnt5kopRHjwgvB6AXBlKJoswCYhJ3sT6fYVll6k9x+FVYe386gyBlK7e0YWLXdXhhUoXKj8EdheMDFUYuhvr1VhzyqGCpRW+o="}
示例代码:
非对称加密 ,公钥加密,私钥解密
//RSA-加密方法
String en = RSAEncrypt.encrypt(publicKey, "hahh就是急是范德萨发生的发生的发生发");
System.out.println(en);
//RSA-解密方法
String old = RSAEncrypt.decrypt(privateKey, en);
System.out.println(old);
------------------------------------------------------------
对称加解密 ,使用同样的key加密同样的key解密
//AES-加密
String enAes = AESEncryptionUtil.encryptData(aesKey, "3423423423423423423423423");
System.out.println(enAes);
//AES-解密
String deAes = AESEncryptionUtil.decryptData(aesKey, enAes);
System.out.println(deAes);
返回结果:
最后返回结果是 加密后的json字符串
需要先进行解密、然后 jsondecode();
得到结果。