Как установить заголовок 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
Надеюсь, это помогает кому-то другому.