Тонкие выходы JSON

Я использую структуру Slim с PHP для создания RESTful API для моего приложения. Однако я предположил, что структура будет иметь некоторый способ создания более простых JSON-выходов, а не просто exit($jsonEncodedVariable); ,

Я что-то пропустил в рамках, или мне нужно использовать json_encode()exit($json) … для каждого метода?

Все данные извлекаются из моей базы данных MySQL и затем помещаются в массив JSON в зависимости от того, какой вызов REST был вызван.

Например, если было запрошено /api/posts/all , я бы exit() массив JSON всех сообщений, каждое значение которого для его собственного ключа, "value" : key .

Мой вопрос в том, есть ли простой способ, используя тонкую структуру, для exit() вместо кода JSON вместо того, чтобы exit() из него как обычный текст?

 header("Content-Type: application/json"); echo json_encode($result); exit; 

Подсказка: использование Slim PHP Framework для разработки API REST

Почему бы просто не использовать объект ответа Slim? (также … зачем выходить?)

 $dataAry = // Some data array $response = $app->response(); $response['Content-Type'] = 'application/json'; $response['X-Powered-By'] = 'Potato Energy'; $response->status(200); // etc. $response->body(json_encode($dataAry)); // Or echo json_encode($dataAry) 

Позвольте мне предисловие, сказав, что я все еще считаю себя noob, поэтому, если я делаю ошибки, пожалуйста, исправьте меня, чтобы я мог учиться. Но я играл с подобной проблемой / вопросом, и я подумал, что могу перезвонить с 2 центами и немного больше обсудить этот вопрос. Чем больше информации о Slim on Stack, тем лучше.

Я в основном играл с тем же, и я заметил, что вы используете выход ; Сначала я использовал exit также потому, что эхо включало в себя кучу HTML и удаляло то, что возвращалось на мой вызов AJAX. Когда я использовал exit, он чисто вырезал HTML, но тогда объект Slim response не менял заголовки ответов, как я определил (см. Выше код.)

Я понял, что это не так, как Слим был разработан для работы. Используйте эхо, а не выход. ПРИМЕЧАНИЕ. – Slim Doc:

Всякий раз, когда вы используете echo () в обратном вызове маршрута, содержимое echo () 'd> записывается> в выходной буфер и затем добавляется в тело ответа до ответа HTTP-ответа на клиента.

Это удобно, но я не мог эхо. То, что я испортил, было большой проблемой. Разделение контента на поведение. Если вы похожи на меня, вы создаете одностраничное приложение, в котором этот код в основном находится на index.php. Есть начальный html, который мне нужно было загрузить, поэтому я включил его на эту страницу. Мне нужно было сделать более чистое разделение. Моя маршрутизация была правильно настроена, и поэтому, когда люди GET '/', Slim_Views (см. Develop Rel.) Возвращают визуализированный шаблон html и js для меня. Brilliant!

Теперь у меня есть все инструменты Slim, и мой код намного чище, раздельный, управляемый и более совместимый с протоколами HTTP. Я думаю, для этого нужны рамки. 🙂

ПРИМЕЧАНИЕ. Я не говорю, что это то, что спустилось с вашей стороны, но я подумал, что вопрос и ваша настройка выглядят очень схожими. Это может помочь другому новому парню, который бродит по этому же пути.

Используя Slim 3, я использую этот формат:

 <?php $app = new \Slim\App(); $app->get('/{id}', function ($request, $response, $args) { $id = $request->getAttribute('id'); return $response->withJSON( ['id' => $id], 200, JSON_UNESCAPED_UNICODE ); }); 

По запросу «/ 123», результат JSON:

 { id: "123" } 

Более подробная информация читается здесь .

[UPDATE] Добавлен второй и третий парам с помощью withJSON . Второй – это код состояния HTTP, а третий – параметры кодирования Json (лучше всего для особых символов и других, например: print «ã» правильно)

вы можете расширить slim с выходной функцией, выход которой зависит от запроса REST:

 class mySlim extends Slim\Slim { function outputArray($data) { switch($this->request->headers->get('Accept')) { case 'application/json': default: $this->response->headers->set('Content-Type', 'application/json'); echo json_encode($data); } } } $app = new mySlim(); 

и используйте его так:

 $app->get('/test/', function() use ($app) { $data = array(1,2,3,4); $app->outputArray($data); }); 

Поскольку каждый усложнил свои ответы функциями и классами, я сделаю этот упрощенный ответ. \ Slim \ Http \ Response может сделать это для вас следующим образом:

 $app = new \Slim\Slim(); $app->get('/something', function () use ($app) { $response = $app->response(); $response['Content-Type'] = 'application/json'; $response->status(200); $response->body(json_encode(['data' => []])); }); $app->run(); 

Поскольку вы, скорее всего, только возвращаете данные JSON, может быть хорошей идеей создать соответствующее промежуточное программное обеспечение, см. http://www.sitepoint.com/best-practices-rest-api-scratch-introduction/ .

Я думаю, что Slim также предоставляет объект промежуточного слоя, который делает это автоматически, поэтому пользователям этой структуры не нужно писать json_decode и кодировать каждый запрос, называемый объектом Slim_Middleware_ContentType .

 $app->response()->('application/json'); $app->add(new Slim_Middleware_ContentType()); 

он выполняет декодирование для вас. декодирование работает отлично. Но для кодирования последнее сообщение отлично.

Спасибо, Дхарани

Я чувствую твою боль. Я хотел сделать функцию многократного использования, поэтому я сделал файл помощников и включил это:

 function toJSON($app, $content) { $response = $app->response; $response['Content-Type'] = 'application/json'; $response->body( json_encode($content) ); }; 

И тогда я использовал его так:

 $app->get('/v1/users/:id', function($id) use ($app) { //instantiate SMM data model $model = new user_model($site); //get all docs, or one, depending on if query contains a page ID $doc = $model->get(array()); //if the object contains main -- we don't need the outer data. toJSON($app, $doc); }); 

Редактирование: я думаю, было бы очень приятно, если бы уже были такие функции, как встроенные в объект ответа для популярных типов mime

 function _die($array){ echo json_encode($array); exit; } $result = mysql_query("SELECT * FROM table"); while($row = mysql_fetch_assoc($result)){ $array[] = $row; } _die($array); 

почему не $response->write(json_encode($dataAry)); вместо echo json_encode($dataAry); ?

Мое исправление добавляло «exit»; в конце json-печати мой сервер-разработчик не заботился, но мой живой сервер не запускал событие json end. Мне не нужно было добавлять заголовки или использовать json_encode.

// Выход JSON в slim3

$ app-> get ('/ users', function ($ request, $ response, $ args) {

 require 'db_connect.php'; $stmt = $pdo->query("SELECT * FROM users"); $result=$stmt->fetchAll(PDO::FETCH_ASSOC); if ($stmt->rowCount() > 0) { return $response->withStatus(200) ->withHeader('Content-Type', 'application/json') ->write(json_encode($result)); } else{ $result = array( "status" => "false", "message" => "Result not found" ); return $response->withStatus(200) ->withHeader('Content-Type', 'application/json') ->write(json_encode($result)); } 

});

Используйте Slim JSON API https://coderwall.com/p/otcphg/create-a-json-restfull-api-using-slim-framework . Вы можете обрабатывать выходные данные JSON.

Я использую slim-jsonAPI для моего API для включения JSON-ответа. Код Init выглядит примерно так:

 <?php function APIRequests () { $app = \Slim\Slim::getInstance(); $app->view(new \JsonApiView()); $app->add(new \JsonApiMiddleware()); } $app->group('/api', 'APIRequests', function () use ($app) { require ('api/areas.php'); }); 

Маршрут будет выглядеть примерно так:

 <?php $app->get('/areas/:id', function ($id) use ($app) { $app->render(200, Area::find($id)); }); 

Мне очень нравится уровень абстракции с использованием промежуточного программного обеспечения и группировки маршрутов, что упрощает применение разных типов ответов в разных областях приложения.

[BEFORE]: Текст-тип контента / html; кодировка = UTF-8

Не работает с SOAPUI JSON 🙁

 $this->get('get_all', function ($req, $res, $args) { $um = new UserModel(); return $res ->withHeader('Content-Type', 'application/json') ->getBody() ->write( json_encode( $um->get_all() ) ); }); - $this->get('get_all', function ($req, $res, $args) { $um = new UserModel(); return $res ->withHeader('Content-Type', 'application/json') ->getBody() ->write( json_encode( $um->get_all() ) ); }); 

[ПОСЛЕ]: приложение Content-Type / json; charset = utf-8

Работа с SOAPUI JSON;)

 $this->get('get_all', function ($req, $res, $args) { $um = new UserModel(); return $res ->withHeader('Content-type', 'application/json;charset=utf-8') ->withJson($um->get_all()); 

Вы можете использовать в slim3, пользовательский метод объекта Slim Response withJson ($ data, $ status, $ encodingOptions)

 $app->get('/hello/{name}', function ($request, $response, $args) { $data['msg']='Hello '.$request->getAttribute('name'); $newResponse = $response->withJson($data); }); 

Для получения дополнительной информации читайте здесь.

header («Content-Type: application / json»); echo json_encode ($ data);