Request 헤더
모든 HTTP 요청은 헤더를 가진다. 요청 본분에 보이지 않으며 HTTP 요청을 나타내는 메타데이터이다.
PSR-7 요청 객체는 헤더를 검사하는 여러 메소드들을 제공한다.
getHeaders() 는 모든 HTTP 요청 헤더를 배열로 가져온다.
배열의 키는 헤더 이름이 되고, 그 값은 문자열로 된 숫자 배열이다.
1 2 3 4 5 | $headers = $request->getHeaders(); foreach ($headers as $name => $values) { echo $name . ": " . implode(", ", $values); } | cs |
getHeader($name) 은 하나의 헤더값을 가져온며 지정된 헤더 이름($name)의 값을 배열로 반환한다. 하나의 HTTP 헤더는 하나 이상의 값을 가질 수 있다.
getHeaderLine($name) 은 헤더의 모든 값을 콤마로 구분된 문자열로 가져온다.
hasHeader($name) 은 해당 헤더의 존재 여부를 확인할 수 있다.
Request 본문
모든 HTTP 요청은 본문을 가진다.
JSON 이나 XML 데이터로 HTTP 요청을 하는 경우, PSR-7 요청 객체의 getParsedBody() 를 사용하여 PHP 형식으로 HTTP 요청 본문을 파싱할 수 있다.
- JSON 요청은 json_decode($input, true) 을 사용하여 배열로 변환된다.
- XML 요청은 simplexml_load_string($input) 을 사용하여 SimpleXMLElement 로 변환된다.
- URL-encoded 요청은 parse_str($input) 을 사용하여 PHP 로 변환된다.
Slim 의 PSR-7 요청 객체는 \Psr\Http\Message\StreamInterface 의 인스턴스로 HTTP 요청 본문을 표현한다.
getBody() 메소드로 HTTP 요청 본문 SteamInterface 인스턴스를 얻을 수 있다.
getBody() 메소드는 요청된 HTTP 의 크기를 알 수 없거나 이용 가능한 메모리 보다 크기가 더 큰 경우에 사용한다.
\Psr\Http\Message\StreamInterface 인스턴스는 PHP 리소스를 검사하고 반복 작업할 다음의 메소드들을 제공한다.
- getSize()
- tell()
- eof()
- isSeekable()
- seek()
- rewind()
- isWritable()
- write($string)
- isReadable()
- read($length)
- getContents()
- getMetadata($key = null)
Request 헬퍼
Slim 의 PSR-7 Request 객체는 HTTP 요청을 더 자세히 분석하는데 도움을 주는 추가적인 메소드를 제공한다.
Request 객체의 isXhr() 메소드로 HTTP 요청 헤더에 XHR 요청(X-Requested-With: XMLHttpRequest)이 존재하는지 확인할 수 있다.
1 2 3 4 5 6 7 | POST /path HTTP/1.1 Host: example.com Content-type: application/x-www-form-urlencoded Content-length: 7 X-Requested-With: XMLHttpRequest foo=bar | cs |
1 2 3 4 5 6 7 8 9 | if ($request->isXhr()) { // Do something } $contentType = $request->getContentType(); $mediaType = $request->getMediaType(); $mediaParams = $request->getMediaTypeParams(); $length = $request->getContentLength(); | cs |
Route 객체
가끔은 미들웨어에서 라우트 파라미터를 필요로 한다.
예제에서는 먼저 사용자가 로그인이 되었는지 체크하고, 특정 비디오를 볼 수 있는 권한이 있는지 체크한다.
1 2 3 4 5 6 7 | $app->get('/course/{id}', Video::class.":watch")->add(Permission::class)->add(Auth::class); //.. In the Permission Class's Invoke /** @var $route \Slim\Route */ $route = $request->getAttribute('route'); $courseId = $route->getArgument('id'); | cs |
Media Type 파서
Slim 은 요청의 미디어 타입을 확인하고, 인식되는 경우, $request->getParsedBody() 를 사용하여 구조화된 데이터로 파싱된다.
이것은 보통 배열이지만, XML 미디어 타입 객체이다.
다음은 인식하고 파싱되는 미디어 타입이다.
- application/x-www-form-urlencoded
- application/json
- application/xml & text/xml
이 외 다른 미디어 타입을 파싱하려면, 가공되지 않은 본문을 파싱하거나 새로운 미디어 파서를 등록해야 한다.
미디어 파서는 단순히 $input 문자열로 입력을 받고 파싱된 객체나 배열을 반환하는 호출 가능한 것이다.
파싱된 본문에 처음으로 접근을 시도하기 전에 어플리케이션이나 라우트 미들웨어에 새로운 미디어 파서를 등록하라.
예를 들어, text/javascript content type 으로 보내진 JSON 을 자동으로 파싱하기 위해, 미들웨어에 다음과 같이 미디어 타입 파서를 등록한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | // Add the middleware $app->add(function ($request, $response, $next) { // add media parser $request->registerMediaTypeParser( "text/javascript", function ($input) { return json_decode($input, true); } ); return $next($request, $response); }; | cs |
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.