批改状态:合格
老师批语:代码很清晰,不错嘛
已知有一个控制器类如下:
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/adminecho call_user_func_array([(new $controller),$method],$parameter);
实验结果:
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部分:
<?phpheader('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;}?>
随机输入一个城市名测试:
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号