
응답 (Response)
Slim 앱의 경로 및 미들웨어에는 클라이언트로 반환될 현재 HTTP 응답을 나타내는 PSR-7 응답 객체가 제공됩니다. 응답 객체는 PSR-7 responseinterface HTTP 응답 상태, 헤더 및 본문을 검사하고 조작할 수 있습니다.
응답 본문 (The Response Body)
HTTP 응답에는 일반적으로 본문이 있습니다.
PSR-7 Request 객체와 마찬가지로 PSR-7 Response 객체는 PsrHttp\Message\StreamInterface
의 인스턴스로 본문을 구현한다. HTTP 응답 본문 ‘StreamInterface’ 인스턴스는 PSR-7 응답 객체의 ‘getBody()’ 메서드로 가져올 수 있습니다. 송신 HTTP 응답 길이를 알 수 없거나 사용 가능한 메모리에 비해 너무 큰 경우 ‘get Body()’ 메서드를 사용하는 것이 좋습니다.
$body = $response->getBody();
Figure 11: HTTP 응답 바디 가져오기
결과인 Psr\Http\Message\StreamInterface
인스턴스는 기본 PHP ‘리소스’에서 읽고, 반복하고, 쓸 수 있는 다음과 같은 방법을 제공한다.
- getSize()
- tell()
- eof()
- isSeekable()
- seek()
- rewind()
- isWritable()
- write($string)
- isReadable()
- read($length)
- getContents()
- getMetadata($key = null)
대부분의 경우 PSR-7 Response 객체에 써야 합니다. 다음과 같이 ‘write()’ 메서드를 사용하여 ‘StreamInterface’ 인스턴스에 내용을 쓸 수 있습니다.
$body = $response->getBody();
$body->write('Hello');
Figure 12: HTTP 응답 본문에 내용 쓰기
PSR-7 Response 개체의 본문을 완전히 새로운 ‘StreamInterface’ 인스턴스로 대체할 수도 있습니다. 원격 대상(예: 파일 시스템 또는 원격 API)의 콘텐츠를 HTTP 응답으로 파이핑하려는 경우 특히 유용합니다. PSR-7 Response 개체의 본문을 ‘withBody(Stream $body)’ 메서드로 바꿀 수 있습니다. 인수는 Psr\Http\Message\StreamInterface
의 인스턴스여야 합니다. (MUST)
use GuzzleHttp\Psr7\LazyOpenStream;
$newStream = new LazyOpenStream('/path/to/file', 'r');
$newResponse = $oldResponse->withBody($newStream);
Figure 13: HTTP 응답 본문 바꾸기
주의점 (reminder)
응답 개체는 변경할 수 없습니다. 이 메서드는 새 본문이 포함된 응답 오브젝트의 복사본을 반환합니다.
JSON 반환 (Returning JSON)
가장 간단한 형태로, JSON 데이터는 기본 200 HTTP 상태 코드로 반환될 수 있습니다.
$data = array('name' => 'Bob', 'age' => 40);
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json');
Figure 14: 200 HTTP 상태 코드가 있는 JSON을 반환
또한 사용자 지정 HTTP 상태 코드로 JSON 데이터를 반환할 수 있습니다.
$data = array('name' => 'Rob', 'age' => 40);
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json')
->withStatus(201);
Figure 15: 201 HTTP 상태 코드로 JSON을 반환
주의점 (reminder)
응답 개체는 변경할 수 없습니다. 이 메서드는 새 Content-Type 헤더가 있는 응답 개체의 복사본을 반환합니다. 이 메소드는 파괴적이며, 기존의 내용 유형 헤더를 대체합니다.
리디렉션 반환 (Returning a Redirect)
Location
헤더를 사용하여 HTTP 클라이언트를 리디렉션할 수 있습니다.
return $response
->withHeader('Location', 'https://www.example.com')
->withStatus(302);
Figure 16: https://www.example.com으로 리디렉션 반환