4. 路由path参数:
/**
* @RequestMapping(route="product/{id}", method={RequestMethod::GET})
* 使用正则控制路由path参数:
* @RequestMapping(route="product/{id}", params={"id"="\d+"}, method={RequestMethod::GET})
*/
public function productDetail(int $id): Response
{
......
}
注:
①. 访问URL:http://127.0.0.1:18306/product/1
②. {id}是path参数,并不是url后面?id=1这部分.
③. {id}的名字必须与形参的$id一致,写成int $pid会自动转换为0.
④. 定义的$id是int类型,如果传入/product/abc,会转换为0.
⑤. 考虑到用户恶意请求,输入一些不合法或大于数据库id的值,可以加入正则限制.
5. 中间件:
(1). 控制器中使用中间件:
use App\Http\Middleware\ControllerMiddleware;
/**
* @Controller(prefix="/product")
* @Middleware(ControllerMiddleware::class) // 中间件注解
*/
class Production {
/**
* @RequestMapping(route="productSearch", method={RequestMethod::GET})
*/
public function productSearch(): array
{
$data = new \stdClass();
return [$data];
}
}
(2). 创建app\Http\Middleware\ControllerMiddleware.php:
use Swoft\Context\Context;
use Swoft\Http\Message\ContentType;
use Swoft\Http\Server\Contract\MiddlewareInterface;
// 最上面控制器使用的Response类也是implements了ResponseInterface类.
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Swoft\Bean\Annotation\Mapping\Bean;
/**
* @Bean()
*/
class ControllerMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// $handler是控制器执行方法的结果
// $result是控制器返回的http response对象,并不是控制器返回的数组
$result = $handler->handle($request);
// 这个就是控制器返回的数组值
$data = $result->getData();
// 后置中间件,增加json返回格式
$response = Context::mustGet()->getResponse();
return $response->withContentType(ContentType::JSON)->withData($data);
}
}
(3). 说明:
①. 以往要调用一个类,需要new一下.
②. Bean容器在启动swoft的时候就会实例化了,会一直存在,使用时就不需要new,可以节省资源.
5. GET参数、POST参数获取:
(1).
use Swoft\Http\Server\Annotation\Mapping\RequestMethod;
/**
* // 共用一条路由:method增加GET与POST
* @RequestMapping(route="product/{id}", params={"id"="\d+"}, method={RequestMethod::GET, RequestMethod::POST})
*/
public function productDetail(int $id): array
{
$data = new \stdClass();
$request = Context::mustGet()->getRequest();
// 获取get、post参数
// $request->get('title', 'default');
// $request->post('title', 'default');
if ($request->getMethod() == RequestMethod::POST) { // 也可以写成"POST"
$data->title = "java入门";
} else {
$data->title = "PHP入门";
}
return $data;
}
GET请求:// http://localhost/product/1?title=PHP => {"title":"PHP\u5165\u95e811"}
POST请求:// http://localhost/product/1 => {"title":"java\u5165\u95e811"}
注:
①. 使用$_GET()、$_POST()获取不了参数.
②. swoft使用的是基于swoole的Http/Server下面的Http/Request->$get()对象的再次封装.
(2). 中间件修改:
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$result = $handler->handle($request);
$data = $result->getData();
$response = Context::mustGet()->getResponse();
$response->withContentType(ContentType::JSON);
if (is_object($data)) {
return $response->withContent(json_encode($data)); // 如果是object返回,需要用withContent
} else {
return $response->withData($data);
}
}
注:
①. 如果是object返回还用$response->withData(),就会是一个{}空对象.
5. JSON参数的最基本获取:
Json参数请求,服务端如何获取?
几个要素
- 判断 请求头 的content-type 是否是application/json
2、如果是,则取 请求的 rowContent
3、如果2OK,则把rawContent 进行json_decode处理