
응답 (Response)
Slim 앱의 경로 및 미들웨어에는 클라이언트로 반환될 현재 HTTP 응답을 나타내는 PSR-7 응답 객체가 제공됩니다. 응답 객체는 PSR-7 responseinterface HTTP 응답 상태, 헤더 및 본문을 검사하고 조작할 수 있습니다.
응답 객체를 가져오는 방법
PSR-7 응답 객체는 다음과 같이 경로 콜백에 대한 두 번째 인수로 Slim 애플리케이션 경로에 주입됩니다.
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->get('/hello', function (Request $request, Response $response) {
$response->getBody()->write('Hello World');
return $response;
});
$app->run();
Figure 1: 응용 프로그램 경로 콜백에 PSR-7 응답을 삽입합니다.
응답 상태 (The Response Status)
모든 HTTP 응답에는 숫자 상태 코드가 있습니다. 상태 코드는 클라이언트에 반환되는 HTTP 응답의 type을 식별합니다. PSR-7 Response 객체의 기본 상태 코드는 200(OK)
입니다. 다음과 같은 getStatusCode()
방법으로 PSR-7 Response 객체의 상태 코드를 얻을 수 있습니다.
$status = $response->getStatusCode();
Figure 2: 응답 상태 코드를 가져옴
PSR-7 응답 오브젝트를 복사하고 다음과 같이 새 상태 코드를 할당할 수 있습니다.
$newResponse = $response->withStatus(302);
Figure 3: 새 상태 코드로 응답을 작성
응답 헤더 (The Response Headers)
모든 HTTP 응답에는 헤더가 있습니다. HTTP 응답을 설명하는 메타데이터이지만 응답 본문에 표시되지 않습니다. PSR-7 Response 객체는 헤더를 검사하고 조작할 수 있는 몇 가지 방법을 제공합니다.
모든 헤더 가져오기 (Get All Headers)
모든 HTTP 응답 헤더를 PSR-7 응답 오브젝트의 getHeaders()
메서드와 연관 배열로 가져올 수 있습니다. 결과적인 연관 배열의 키는 헤더 이름이며, 그 값은 그 자체로 각각의 헤더 이름에 대한 문자열 값의 숫자 배열이다.
$headers = $response->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
Figure 4: 모든 HTTP 응답 헤더를 연관 배열로 가져오고 반복
단일 헤더 가져오기 (Get One Header)
PSR-7 Response 객체의 getHeader($name)
메서드를 사용하여 단일 헤더의 값을 얻을 수 있습니다. 지정된 헤더 이름에 대한 값 배열을 반환합니다. 단일 HTTP 헤더는 둘 이상의 값을 가질 수 있습니다!
$headerValueArray = $response->getHeader('Vary');
Figure 5: 특정 HTTP 헤더에 대한 값을 가져옴
PSR-7 Response 객체의 getHeaderLine($name)
메서드를 사용하여 지정된 헤더에 대한 모든 값이 포함된 쉼표로 구분된 문자열을 가져올 수도 있습니다. getHeader($name) 메서드와 달리 이 메서드는 쉼표로 구분된 문자열을 반환합니다.
$headerValueString = $response->getHeaderLine('Vary');
Figure 6: 단일 헤더의 값을 쉼표로 구분된 문자열로 가져옴
헤더 존재 여부 확인 (Detect Header)
PSR-7 Response 객체의 ‘hasHeader($name)’ 방법으로 헤더의 존재 여부를 테스트할 수 있습니다.
if ($response->hasHeader('Vary')) {
// Do something
}
Figure 7: 특정 HTTP 헤더의 존재 여부를 확인
헤더 설정 (Set Header)
PSR-7 Response 객체의 withHeader($name, $value)
방법으로 헤더 값을 설정할 수 있습니다.
$newResponse = $oldResponse->withHeader('Content-type', 'application/json');
Figure 8: HTTP 헤더 설정
주의점 (Reminder)
응답 개체는 변경할 수 없습니다. 이 메서드는 새 헤더 값이 있는 응답 개체의 복사본을 반환합니다. 이 메서드는 파괴적이며 동일한 헤더 이름과 이미 연결된 기존 헤더 값을 대치합니다.
헤더 추가 (Append Header)
PSR-7 Response 객체의 ‘withAddedHeader($name, $value)’ 메서드를 사용하여 헤더 값을 추가할 수 있습니다.
$newResponse = $oldResponse->withAddedHeader('Allow', 'PUT');
Figure 9: HTTP 헤더 추가
주의점 (reminder)
withHeader()
메서드와 달리 이 메서드는 동일한 헤더 이름에 대해 이미 존재하는 값 집합에 새 값을 추가합니다. 응답 개체는 변경할 수 없습니다. 이 메서드는 헤더 값이 추가된 응답 오브젝트의 복사본을 반환합니다.
헤더 제거 (Remove Header)
응답 개체의 withoutHeader($name)
메서드를 사용하여 헤더를 제거할 수 있습니다.
$newResponse = $oldResponse->withoutHeader('Allow');
Figure 10: HTTP 헤더 제거
주의점 (reminder)
응답 개체는 변경할 수 없습니다. 이 메서드는 지정된 헤더 없이 응답 개체의 복사본을 반환합니다.