CakePHP4.0.4 표준에 추가된 BodyParer Middleware는 WebAPI 응용 프로그램을 쓰기 쉽게 만듭니다

말하자면 제목과 같이 인터넷에 정보가 없기 때문에 한 획을 써 보았다!

BodyParerMiddleware란


CakePHP의 Cookbook(참조)에는 다음과 같습니다.
cf. 미들웨어 - CkePHP 4.x Strawberry Cookbook
응용 프로그램이 JSON, XML 또는 다른 인코딩된 요청 주체를 받아들일 때 BodyParserMiddleware 을 사용하면 이 요청을 그룹별로 디코딩하여 $request->getParsedData()$request->getData() 에서 사용할 수 있다.기본적으로 json 기체만 세척하지만, 선택에서 XML 세척을 사용할 수 있습니다.자체 서버를 정의할 수도 있습니다.
중요한 것은 Content-Type: application/jsonContent-Type: application/xml에서 점파될 때 중간부품은 점파 주체를 신속하게 제거할 수 있다.
CakePHP 3.6.0class Cake\Http\Middleware\BodyParserMiddleware를, 케이크PHP의 애플리케이션 템플릿cakephp/app4.0.4 추가을 추가했다.CakePHP4가 되면 기본적으로 사용됩니다.

뭐가 편해요?


CakePHP3에 웹API 앱을 쓸 때는 Content-Type: application/json에서Hash가 요청을 받을 때의 요청 주체를 위해 아래와 같이 하나씩json_decode() 물어야 한다.
일부 팟캐스트 주체를 원하더라도 먼저 팟캐스트 주체의 전체 내용을 받아들인 다음에 부분을 방문해야 한다는 느낌은 편리성이 부족하다.
ArticleController.php
<?php
namespace App\Controller;
// 中略
class ArticleController extends AppController
{
    public function edit(string $id)
    {
        $postData = $this->getRequest()->input('json_decode', true);
        $title = $postData['title'];
        // 以下略
Content-Type: application/x-www-form-urlencoded 또는 Content-Type: multipart/form-data의 POST 요청$_POST에 값이 포함된 경우 $this->getRequest()->getData()에서 얻을 수 있습니다.
그런데 지금 application/jsonapplication/xml에서 갑자기 하고 싶잖아~🥺
(또는 JavaScript/TypeScript에서 HTTP 클라이언트로 자주 사용axios기본값Content-Type: application/x-www-form-urlencoded입니다.으음...)
그걸 해결할 수 있는 건BodyParserMiddleware.$type = 'application/json' 이러한 Content-Type 문자열은 정의되고 각 Content-Type에 따라 해당하는 $parser 클론으로 처리됩니다.뜨거워!
https://github.com/cakephp/cakephp/blob/4.2.10/src/Http/Middleware/BodyParserMiddleware.php#L165-L170
BodyParserMiddleware.php
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
		// 中略 
        $parser = $this->parsers[$type];
        $result = $parser($request->getBody()->getContents());
        if (!is_array($result)) {
            throw new BadRequestException();
        }
        $request = $request->withParsedBody($result);
        // 以下略
또한 BodyParserMiddleware에서 처리된 요청 주체는 사소한 의식$this->getRequest()->getData()이 얻지 못하도록 요청 정보에 저장되었다.뜨거워!!
ArticleController.php
<?php
namespace App\Controller;
// 中略
class ArticleController extends AppController
{
    public function edit(string $id)
    {
        $title = $this->getRequest()->getData('title'); 
        // 以下略

끝말


따라서 CakePHP4에 웹API 앱을 쓸 때 좀 더 원활하게 쓰기 위한 작업BodyParserMiddleware을 소개했다.
이것으로 당신만의 최강의 웹API 앱을 만들어 보세요!!!

참고 자료

  • 미들웨어 - CkePHP 4.x Strawberry Cookbook
  • 좋은 웹페이지 즐겨찾기