Slim Framework 매뉴얼 Response (응답) #2 본문, JSON 반환, 리다이렉트

응답 (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으로 리디렉션 반환