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($inputtrue);
        }
    );
    
    return $next($request$response);
};
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,