一.控制器访问与参数解析类
已知有一个控制器类如下:
class UserController
{
public function show($id,$name)
{
return 'Hello '.$name . ', id = ' . $id;
}
}
如果需要用url参数调用这个类,我们一般会使用
“http://www.test.com/Controller.php?user=show&id=10&name=admin”
,这种URL对于搜索引擎非常不友好的。很多搜索引擎收录的时候,都会忽略Query String之后的内容,为此我们需要写一个类从url的pathinfo中解析出控制器和方法
//目标:将URL中的控制器和方法以及参数解析出来
class GetControllerInfo
{
public $pathinfo;
public function __construct($original_path_info)
{
$this->pathinfo = array_filter(explode('/', $original_path_info));
}
//解析控制器
public function getController()
{
return ucfirst($this->pathinfo[1]) . "Controller";
}
//解析控制器中的方法名称
public function getMethod()
{
return $this->pathinfo[2];
}
//解析参数
public function getParameters()
{
$params_array = [];
$params = array_slice($this->pathinfo, 2);
for ($i = 0; $i < count($params); $i += 2) {
if (isset($params[$i + 1])) {
$params_array[$params[$i]] = $params[$i + 1];
}
}
return $params_array;
}
}
使用url:
http://localhost:3000/0305homework/Controller.php/user/show/id/10/name/admin
在Controller页面引入解析类:
require 'parameter_parse.php';
$userparameter = new GetControllerInfo($_SERVER['PATH_INFO']);
$controller = $userparameter->getController();
$method = $userparameter->getMethod();
$parameter = $userparameter->getParameters();
// echo $parameter;
// var_dump($controller);
// var_dump($method);
// var_dump($parameter);
// 请求数据:http://localhost:3000/0305homework/Controller.php/user/show/id/10/name/admin
echo call_user_func_array([(new $controller),$method],$parameter);
实验结果:
二.利用api让用户输入城市并显示天气预报
1.html部分:
<!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>Document</title>
</head>
<body>
<form action="" method="get">
输入所在城市:<input type="text" name="city" >
<input type="submit">
</form>
<div class="show">
<table border="1">
<thead>所在城市天气预报</thead>
<tbody>
<tr>
<th>所在城市</th>
<th>当前温度</th>
<th>当前湿度</th>
<th>当前天气</th>
<th>当前风向</th>
<th>当前风力</th>
<th>当前空气质量</th>
</tr>
<tr>
<td><?=$data['city']?></td>
<td><?=$data["realtime"]["temperature"]?></td>
<td><?=$data["realtime"]["humidity"]?></td>
<td><?=$data["realtime"]["info"]?></td>
<td><?=$data["realtime"]["direct"]?></td>
<td><?=$data["realtime"]["power"]?></td>
<td><?=$data["realtime"]["aqi"]?></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
php部分:
<?php
header('content-type:text/html;charset=utf-8');
header('Access-Control-Allow-Origin:*');
// 请求的接口URL
$apiUrl = 'http://apis.juhe.cn/simpleWeather/query';
// 请求参数
$params = [
'city' => $_GET['city'], // 要查询的城市
'key' => '43ecc4a52161a4d8c176f3087f79786c'
];
$paramsString = http_build_query($params);
// 发起接口网络请求
$response = juheHttpRequest($apiUrl, $paramsString , 1);
$result = json_decode($response, true);
if ($result) {
$errorCode = $result['error_code'];
if ($errorCode == 0) {
// 获取返回的天气相关信息,具体根据业务实际逻辑调整修改
$data = $result['result'];
} else {
// 请求异常
echo "请求异常:{$errorCode}_{$result["reason"]}".PHP_EOL;
// echo json_encode("请求异常:{$errorCode}_{$result["reason"]}");
// echo "callback(".$data.")";
}
} else {
// 可能网络异常等问题,无法正常获得相应内容,业务逻辑可自行修改
echo "请求异常".PHP_EOL;
}
/**
* 发起网络请求函数
* @param $url 请求的URL
* @param bool $params 请求的参数内容
* @param int $ispost 是否POST请求
* @return bool|string 返回内容
*/
function juheHttpRequest($url, $params = false, $ispost = 0)
{
$httpInfo = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($ch, CURLOPT_TIMEOUT, 12);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if ($ispost) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_URL, $url);
} else {
if ($params) {
curl_setopt($ch, CURLOPT_URL, $url.'?'.$params);
} else {
curl_setopt($ch, CURLOPT_URL, $url);
}
}
$response = curl_exec($ch);
if ($response === FALSE) {
// echo "cURL Error: ".curl_error($ch);
return false;
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$httpInfo = array_merge($httpInfo, curl_getinfo($ch));
curl_close($ch);
return $response;
}
?>
随机输入一个城市名测试: