Я использую структуру 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);