PHP扩展知识:URL相关函数和api接口案例
程序员文章站
2022-03-01 17:22:20
...
一.URL相关函数知识点
1.一般URL的组成:
- 协议:http或者https等等
- 域名(ip地址)
- 端口:默认80;https默认443
- 文件路径
- 真正访问的文件
- PATH_INFO
-
?
查询参数:多个参数之间通过&
连接,空格用加号+
-
#
锚点信息
2.常见获取URL信息的函数
-
$_SERVER['SERVER_NAME']
获取当前脚本运行在服务的域名:主机名 -
$_SERVER['REQUEST_URI']
URI 用来指定要访问的页面。例如
“/index.html”。 -
$_SERVER['PHP_SELF']
获得当前执行脚本文件名:包含路径 -
$_SERVER['SCRIPT_NAME']
包含当前脚本的路径。 -
$_SERVER['PATH_INFO']
包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息 -
$_SERVER['QUERY_STRING']
获取当前请求的查询字符串
3.URL相关的函数;
-
urlencode("str")
与urldecode("url")
:URL地址的编码和解码 -
parse_str("query_string",$arr);
把查询字母串解析成一个关联数组给$arr; -
http_build_query("关联数组");
把一个关联数组转换成查询自负床格式 -
parse_url('url');
:解析URL并返回成一个关联数组
4.其他常用url相关的常用函数
-
explode("分隔符","字符串")
:把字符串分割成数组; -
ucfirst("字符串")
:把字符串首字母大写 -
array_filter($arr)
:过滤数组中的空值 -
call_user_func_array([obj,func],[参数...]);
异步调用函数 -
__NAMESPACE__
:空间名魔术常量;
5.其他函数:
- file_exist(“文件路径名字”):判断文件是否存在
- file_put_contents(“文件名”,”写入内容”,FILE_APPEND);把内容追加写入文件
-
PHP_EOL
:换行常量
二.PHP发起http请求:curl函数的使用
1.$curl=curl_init();初始化请求会话
2.curl_setopt($curl,”参数类型常量”,参数值);设置请求会话配置项;参数类型常量如下
- CURLOPT_URL:请求url
- CURLOPT_HTTPGET:设置请求类型GET;值为true|flase;
- CURLOPT_HEADER:设置请求头信息:flase;
- CURLOPT_RETURNTRANSFER:设置指只返回结果,不输出;true;
3.$res=curl_exec($curl);执行请求返回结果
4.curl_close($curl);关闭请求会话;
三.案例实战:
(一)处理url地址中控制器访问与参数解析的类
1.此案例基于上一次作业:https://www.php.cn/blog/detail/26607.html
增加url地址解析类
<?php
use app\Models\StaffsModel;
use core\View;
include __DIR__."/vendor/autoload.php";
// echo "OK";
class Route
{
private $classname="";
private $func="";
private $params=[];
public $model=null;
public $view=null;
// private $class=null;
public function __construct(StaffsModel $model,View $view){
$this->model=$model;
$this->view=$view;
$this->execute();
}
//通过url地址信息获取控制器和函数名,并获取参数;
public function purl(){
if($_SERVER["PATH_INFO"]){
$PI= $_SERVER["PATH_INFO"];
$PI=ltrim($PI,'/');
$controller=ucfirst(strstr($PI,'/',true));
$func=ltrim(strstr($PI,"/"),"/");
// echo $func,$controller;
$this->classname="app\\Controllers\\".$controller;
$this->func=$func;
}
if($_SERVER["QUERY_STRING"]){
$p=$_SERVER["QUERY_STRING"];
parse_str($p,$params);
// print_r($params);
$this->params=array_filter($params);
}
}
public function execute(){
$this->purl();
//以变量名实列化类时:变量值必须具备完整命名空间
$obj=new $this->classname ($this->model,$this->view);
return call_user_func_array([$obj,$this->func],$this->params);
// echo $this->classname,"<br>".$this->func,"<br>".print_r($this->params,true);
}
}
2.入口文件
include __DIR__."/Route.php";
include __DIR__."/vendor/autoload.php";
$model=new StaffsModel();
$view=new View("app/View/staffs");
new Route($model,$view);
3.运行结果:
(二)api接口的调用实战
1.代码
<?php
$url="http://v.juhe.cn/joke/content/text.php?";
$key="b82ad6748770b5130d49f61a7e12bae0";
$page=1;
$pagesize=5;
$time=time();
$query=http_build_query(["key"=>$key,"page"=>$page,"pagesize"=>$pagesize]);
// echo "<pre>".$url.$query;
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url.$query);
curl_setopt($curl,CURLOPT_HTTPGET,true);
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$res=curl_exec($curl);
curl_close($curl);
// var_dump($curl);
$data=json_decode($res,true);//把json数据类型转换成数组
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>api-5个小笑话</title>
</head>
<body>
<?php if($data["error_code"]===0):?>
<?php foreach($data["result"]["data"] as $row):?>
<h3><?= $row["updatetime"]?></h3>
<p><?= $row["content"]?></p>
<hr>
<?php endforeach ?>
<?php else:?>
<p><?=$data["reason"]?></p>
<?php endif ?>
</body>
</html>
2.运行结果