Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 2

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

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

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

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

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

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

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

Ответ 3

Используя 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"
}

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

[ОБНОВЛЕНИЕ] Добавлен второй и третий параметр в withJSON. Второй - это код состояния HTTP, а третий - параметры кодирования Json (лучше всего для особых символов и других, например: print "ã" правильно)

Ответ 4

вы можете расширить 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);
});

Ответ 5

Поскольку каждый усложнил свои ответы функциями и классами, я сделаю этот упрощенный ответ. \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/.

Ответ 6

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

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

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

Спасибо, Dharani

Ответ 7

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

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

Ответ 8

function _die($array){
   echo json_encode($array);
   exit;
}


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

_die($array);

Ответ 9

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

Ответ 10

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

Ответ 11

//Выход 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));
}

});

Ответ 13

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

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

Ответ 14

[ПЕРЕД]: текст типа содержимого /html; charset = 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()
        )
    );
});

[ПОСЛЕ]: приложение 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());

Ответ 15

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

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

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

Ответ 16

заголовок

( "Content-Type: application/json" );   echo json_encode ($ data);