PHP 控制器怎么调接口,mvc控制器的访问与参数解析和API接口获取数据
mvc控制器的访问与参数解析和API接口获取数据
一、控制器访问与参数解析
我们在使用框架,诸如 ThinkPHP 、Laravel时,访问一个页面,例如:http://localhost/idnex.php/user/admin/id/1,这样就可以找到用户名(user)为admin,id为1的用户了。这是什么原理呢?这个就是通过PATHINFO的方式来进行的参数解析。框架是MVC架构,我们也知道,框架在运行过程中,我们实际上访问的是控制器的方法,因此,url地址最终肯定都要定位到一个控制器方法中。
案例:假设当前demo1.php脚本当成框架的入口文件(类似于TP中的index.php入口文件)。即访问地址是:http://localhost:8888/PHP/20210305/demo1.php?controller=user&action=show。
控制器类
classUserController
{
publicfunctionshow():string
{
return"Hello, World!";
}
}
解析控制器
// 通过url地址获取controller和action参数
$controller=ucfirst($_GET['controller']).'Controller';
$action=$_GET['action'];
// 实例化控制器类,调用show方法
echo(new$controller)->$action();
但是上述通过查询字符串的格式的地址,对于搜索引擎不友好,可以用PATHINFO来优化,地址可以变更成为:http://localhost:8888/PHP/20210305/demo1.php/controller/user/action/show
// 获取PATHINFO路径
$pathinfo=$_SERVER['PATH_INFO'];
// 将PATHINFO路径以“/”为分隔符,切割成一个数组
$queryArr=explode('/',ltrim($pathinfo,'/'));
$controller=ucfirst(array_shift($queryArr)).'Controller';
$action=array_shift($queryArr);
echo(new$controller)->$action();
如果,我们要在PATHINFO路径中传参又该如何解析呢?下面,我把上述的访问地址改造一下,修改成带参数的PATHINFO路径:http://localhost:8888/PHP/20210305/demo1.php/user/show/id/10/name/admin。
控制器类
namespacemvc;
classUserController
{
publicfunctionshow(int$id,string$name):string
{
return"Hello, {$name}! => {$id}";
}
}
根据上述访问地址,先拿到PATHINFO路径,以“/”为分隔符,将其切割成一个数组,并过滤掉数组中键值为空的元素:
$pathinfo=array_filter(explode('/',$_SERVER['PATH_INFO']));
结果图
然后根据上面拿到的结果,生成控制器和方法:
// 生成控制器
$controller=__NAMESPACE__.'\\'.array_shift($pathinfo).'Controller';
// 生成方法
$action=array_shift($pathinfo);
生成了控制器和方法之后,此时就可以将参数从PATHINFO中解析出来了,我们现在先打印一下目前$pathinfo的值:
printf('
%s
',print_r($pathinfo,true));
结果
从上面的结果可以看出,数组中的元素,两两为一组,就是PATHINFO路径中传递的参数值,可以用一个循环将参数和其值保存起来:
// 创建一个空数组保存参数
$params=[];
for($i=0;$i
$params[$pathinfo[$i]]=$pathinfo[$i+1];
}
同时,我们需要考虑的一个问题是:用户有可能在传参的时候传了一个空值,如果我们不处理的话就会造成错误:
// 创建一个空数组保存参数
$params=[];
for($i=0;$i
// 判断当前循环的$i+1的值是否存在
if(isset($pathinfo[$i+1])){
$params[$pathinfo[$i]]=$pathinfo[$i+1];
}
}
// 异步调用
echo call_user_func_array([(new$controller),$action],$params);
这样就不会存在传递的参数中有空值而报错的情况了。
结果
Hello, admin! => 10
二、API接口获取数据演示
API接口使用的是聚合数据提供的免费API,该案例主要是为了研究如何调用第三方接口获取一些数据。我找了一个成语接龙的免费接口做测试案例,下面分享一下我写的代码。
后端代码
declare(strict_types=1);
namespacehomework\api;
useException;
classAPI
{
/**
* 请求api
*
* @var string
*/
private$baseUrl='http://apis.juhe.cn/idiomJie/query';
/**
* 请求参数数组
*
* @var array
*/
public$params=[];
/**
* 初始化参数
*
* @param array $params
*/
publicfunction__construct(array $params=[])
{
$this->params=$params;
}
/**
* 从API获取数据
*
* @return string
*/
publicfunctiongetQueryData():string
{
// 构造查询参数
$query=http_build_query($this->params);
// 完整的查询API地址
$url=$this->baseUrl.'?'.$query;
// echo $url;
// cURL:发起一个http请求
return$this->curl_get($url);
}
/**
* 创建cURL请求
*
* @param string url地址
* @return string
*/
publicfunctioncurl_get(string$url):string
{
// 初始化cURL
$ch=curl_init();
// 设置请求的url完整地址
curl_setopt($ch,CURLOPT_URL,$url);
// 设置请求类型
curl_setopt($ch,CURLOPT_HTTPGET,true);
// 设置hedaer头信息,这里不需要就去掉
curl_setopt($ch,CURLOPT_HEADER,false);
// 默认是浏览器输出,只返回不输出
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
// 执行curl
$data=curl_exec($ch);
if($data){
curl_close($ch);
return$data;
}else{
$errno=curl_errno($ch);
curl_close($ch);
thrownewException("curl出错,错误码:$errno");
}
}
}
$api=newAPI(['key'=>'6a2fb6390f349aec8661a7e9ddae141c','wd'=>$_REQUEST['val']]);
echo $api->getQueryData();
前端代码
API接口请求数据示例
*{
box-sizing:border-box;
}
.form{
width:40rem;
height:3rem;
margin:5rem10rem0;
overflow:hidden;
border-radius:0;
}
form{
width:40rem;
height:3rem;
position:relative;
}
form input{
width:34rem;
height:3rem;
/* border-radius: 10px; */
border-top-left-radius:10px;
border-bottom-left-radius:10px;
outline:none;
border:none;
font-size:1.5rem;
text-indent:.5rem;
border:2pxsolid#c4c7ce;
transition:all.5s;
}
form input:hover{
transition:all.5s;
border-color:#4e6ef2;
}
form button{
width:6rem;
height:3rem;
border-top-right-radius:10px;
border-bottom-right-radius:10px;
background-color:#4e6ef2;
font-size:1.1rem;
border:2pxsolid#4e6ef2;
color:#fff;
position:absolute;
right:0;
top:0;
outline:none;
cursor:pointer;
}
ul,li{
list-style:none;
margin:0;
padding:0;
}
.content{
width:calc(100%-6rem);
border:2pxsolid#4e6ef2;
border-top-width:0;
height:25rem;
padding:1rem001rem;
}
ul{
width:100%;
height:calc(100%-1rem);
background-color:#fff;
overflow-y:scroll;
}
ul li{
width:100%;
line-height:1.6rem;
}
查找一下
PHP 控制器怎么调接口,mvc控制器的访问与参数解析和API接口获取数据相关推荐
- IT隐匿者官方解析系统API接口文档
IT隐匿者官方解析系统API接口文档 简要描述: 需要到平台注册自己账号,然后开通会员权限,就有自己的api接口 平台地址:IT隐匿者解析系统 接口只能用于自己的产品,禁止打包外售或与其他人共用,发现 ...
- php怎么根据接口文档实现功能,CodeIgniter+swagger实现 PHP API接口文档自动生成功能...
一.安装swagger 1.首先需要有composer,没有的自行百度安装 2.下载swagger,打开网站https://packagist.org/packages/zircote/swagger ...
- yii2 提供接口给java_Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)...
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
- 请求接口返回的是一个html_搜狗美图 API 接口请求调用
搜狗美图 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以POST方式提交图片即可.搜狗美图 API 接口每日都会更新一张美图,本 API 接口可选择生成当日美图,也 ...
- web api接口开发实例_小程序开发如何调用 API 接口,以豆瓣电影为例
API 调用是开发者在小程序开发过程中经常会遇到的问题,本期我们以为调用豆瓣电影 API 为例具体来看 API 的调用过程以及常见的一些问题. 测试用到的小程序是「电影周周看」,内容来自清华大学软件学 ...
- java 新浪短网址生成器,新浪短链接接口被限制?最新新浪短网址api接口
背景 新浪短网址api是sina平台官对外公开的短网址生成接口,可以将长链接通过接口生成t.cn样式的短链接,可以说是非常好用的.但近期新浪官方开始对已经公布的接口做出了多重限制,很多之前能用的功能现 ...
- php接口返回一个数组怎末写_PHP写api接口怎么写啊,有什么具体的例子吗?
感谢邀请这里仅仅讨论的是传统的 http 协议接口,不考虑各种类库提供的面向对象接口 简单概括 简单接口示例 echo '{"code":1,"msg":&qu ...
- 在线IP到地理位置解析的API接口,IP到地理位置、所属组织名、AS号、域名反查
有的时候,我们有IP到地理位置.组织名.AS号.域名反向解析的需求,这些IP属性信息对于网络测量统计很有帮助. 如下是本人在日常科研中遇到的免费.可用api. 1. ip-api: 方法: url: ...
- 新浪短链接接口被限制?最新新浪短网址api接口
背景 新浪短网址api是sina平台官对外公开的短网址生成接口,可以将长链接通过接口生成t.cn样式的短链接,可以说是非常好用的.但近期新浪官方开始对已经公布的接口做出了多重限制,很多之前能用的功能现 ...
- 运营商二要素-运营商二要素认证-运营商二要素实名认证-运营商二要素认证接口-运营商二要素api-运营商二要素api接口
运营商二要素接口描述 接口名称 运营商二要素验证_姓名 接口编号 JR-HYT-004 接口描述 运营商二要素验证_姓名 接口地址 /dmp/api 请求方式 POST 加密方式 RSA2 加密方式 ...
最新文章
- ntoskrnl损坏
- 为什么很多SpringBoot开发者放弃了Tomcat,选择了Undertow?
- 【BZOJ】1726 [Usaco2006 Nov]Roadblocks第二短路
- socket编程 (PHP实现)
- MySql日期处理系列-常用的日期推算处理
- [转] 关于SQLSERVER2000卸载与出现挂起问题的解决
- #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else
- 千元内无敌!红米两款新机发布 小米9侧目?
- history(路由控制)
- m6000查看端口状态_中兴ZXR10 M6000维护最常用命令精要
- 编写一个程序,新建一个文件:d:\abc.txt,从键盘输入abc.txt内容(不超过100个字符)。然后新建另外一个文件:d:\def.txt,将abc.txt的前10个字符复制到def.txt上
- MAML++:HOW TO TRAIN YOUR MAML论文精读
- 有趣的小事——程序员难!
- linux 文件隐藏,Linux系统怎么隐藏文件夹和文件?
- 南充一中2021成绩查询高考,2019高考喜报汇总
- ffmpeg probe一个文件的过程
- 仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义
- 美团校招年薪35万!老员工薪资倒挂,如何应对?
- Java基础知识英文选择题1——Basic of Java Programs.
- 【Linux网络编程(九)】ping命令 arp工作流程
热门文章
- Linux下视频流媒体服务器搭建详解
- 微型计算机原理实验二,微型计算机原理与接口技术实验指导(第2版)
- 计算机体系结构.是系统结构还是体系结构
- java基础——数据库
- 分享淘宝利器飞天侠4.1至尊商业版 去除域名限制 绕过淘宝API直接采集
- android 输入光标修改颜色_Android修改光标颜色
- 联想拯救者y7000p 固态移动硬盘安装Linuxmint19.1 操作系统
- 微信小程序-2-微信开发者工具介绍
- tl-wn821n无线网卡驱动 linux,tlwn821n 300m无线网卡驱动 官方最新版
- logo语言是计算机语言吗,LOGO语言的编程