此处需求:测试某调用外部API模块能否实现,通过PHP编写测试API用于解析客户端IP,后拓展调用腾讯地图开发者服务API对IP进行二次解析获取归属地(最高精确到区)。
仅解析ip
$data['time'] = date("Y-m-d H:i:s", time());
$data['ip'] = $_SERVER["REMOTE_ADDR"];
(Db::table('ip_access')->insert($data) == 1);//插入数据库,部分情况下仅调用api,无返回结果,用于检测是否成功调用
$json = array(
'data' => $data['time'].' '.$data['ip'],
);
$in_charset='GBK';
$ret = eval('return ' . iconv($in_charset, "utf-8", var_export($json, true)) . ';');
return $ret;
die;
此处已经实现了解析客户端ip,并记录数据库、返回时间及ip的功能
二次解析归属地
$key="your_key";//你的key
$ip_add = "";//放一个ipadd的空变量
$ip_info = (file_get_contents('https://apis.map.qq.com/ws/location/v1/ip?key='.$key.'&ip='.$data['ip']));//发请求,data['ip']前面获取的
$a=json_decode($ip_info,true)['result']['ad_info'];//解析获取我们需要的字段
//用了四个平行if,纯属比较懒,别喷。
if(array_key_exists('nation',$a))$ip_add=$ip_add.$a['nation'];
if(array_key_exists('province',$a))$ip_add=$ip_add.$a['province'];
if(array_key_exists('city',$a))$ip_add=$ip_add.$a['city'];
if(array_key_exists('district',$a))$ip_add=$ip_add.$a['district'];
$data['ip_add'] = $ip_add;
$ret['data']=$ret['data'].$data['ip_add'];
die;
将代码融合到【仅解析ip】之中,即可实现解析ip归属地的需求。
以下是测试结果