swoft微服务实战十五:获取路由path参数

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参数请求,服务端如何获取?
几个要素

  1. 判断 请求头 的content-type 是否是application/json

2、如果是,则取 请求的 rowContent 

3、如果2OK,则把rawContent 进行json_decode处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值