Как установить заголовок JSON в фреймворке Slim 3 (PHP)?

Как установить заголовок JSON в Slim 3?

$app->get('/joinable', function ($request, $response, $args) { header('Content-Type: application/json'); return getJoinable(); // Returns JSON_encoded data }); 

Я попробовал следующее

$response = $app->response(); $response['Content-Type'] = 'application/json'; $app->contentType('application/json');

Никогда не использовали Slim framework, но, согласно их документации , это должно быть что-то в следующих строках:

 $app->get('/joinable', function ($request, $response, $args) { $body = $response->getBody(); $body->write('{"your_content": "here"}'); return $response->withHeader( 'Content-Type', 'application/json' )->withBody($body); }); 

Что вы пытаетесь с header('Content-Type: application/json'); могут работать, но поскольку вы используете фреймворк для своего приложения, вы должны соблюдать их рекомендации, иначе у вас будет много проблем. Кроме того, getJoinable() является глобальным вызовом, вы должны действительно изучить ООП и, более того, следовать рекомендациям PSR , потому что Slim 3 построен с использованием этих рекомендаций.

Вы можете просто сделать следующее (обратите внимание, что я использую встроенный помощник json encoder):

 return $response->withJson($dataArray)->withHeader('Content-Type', 'application/json'); 

если вы возвращаете много JSON, вы можете подумать о создании группы маршрутов:

 $app->group('/api', function () { $this->response->withHeader('Content-Type', 'application/json'); $this->get(...); $this->get(...); } 

Это экономия времени, и ваш код чистым и масштабируемым.

Объект request имеет метод преобразования массива в JSON и одновременно устанавливает заголовок. См. Документацию здесь

 $app->get('/joinable', function ($request, $response, $args) { return $response->withJson(getJoinable()); }); 

За исключением того, что getJoinable() должен возвращать Array, потому что withJson() преобразует его в json для вас.


Теперь, если вы настаиваете на настройке заголовка самостоятельно, см. Документацию здесь

Код будет выглядеть следующим образом:

 $app->get('/joinable', function ($request, $response, $args) { $body = $this->getBody(); $body->rewind(); // ensure your JSON is the only thing in the body $body->write(getJoinable()); return $response->withHeader('Content-Type', 'application/json;charset=utf-8'); }); 

Если вы уверены, что в этот момент тело пусто, вы можете сохранить шаг и просто использовать метод write() в объекте Response .

 $app->get('/joinable', function ($request, $response, $args) { $response->write(getJoinable()); $response = $response->withHeader('Content-Type', 'application/json;charset=utf-8'); return $response; }); 

И даже более короткие обозначения

 $app->get('/joinable', function ($request, $response, $args) { return $response->write(getJoinable()) ->withHeader('Content-Type', 'application/json;charset=utf-8'); }); 

С помощью PHP 5.4+ вы также можете использовать json pretty printing (не рекомендуется для больших загрузок, поскольку он добавляет примерно на 10-25% к переданному байтузу):

 $app->get('/joinable', function ($request, $response, $args) { return $response->write(json_encode(getJoinable(), JSON_PRETTY_PRINT)) ->withHeader('Content-Type', 'application/json;charset=utf-8'); }); 

Во-первых, я бы посоветовал полную абстракцию рендеринга. Один из них будет легче поддерживать в конечном итоге. Например, у вас может быть класс Renderer с помощью этого метода:

 public function render(Response $response, array $data, $status_code) { return $response->withStatus((int) $status_code) ->withHeader('Content-Type', 'application/json;charset=utf-8') ->withJson($data); } 

где $response – это пример Slim\Http\Response .

Здесь вы можете найти более надежный класс Renderer: slim3-api-output-format

Надеюсь, это помогает кому-то другому.