CakePHP 3.0: ответ в формате json

Я создаю REST API CakePHP 3.0. Я следовал этим инструкциям (маршрутизация в книге) и получил ответ в json. Вот мой код.

01 src/config/rout.php

Router::extensions('json');

02 src/controler/UsersController.php

  public function view($id = null) {
    $data = array('status' => 'o','status_message' => 'ok' );
    $this->set('data', $data);
    $this->set('_serialize', 'data');  
}

03 отправить запрос на публикацию на этот URL

http://domain.com/users/view.json

вывод:

{
    "status": "o",
    "status_message": "ok"
}

Но я хочу получить json без расширения .json. заранее спасибо.


person Mayura Wijewickrama    schedule 02.11.2015    source источник
comment
Попробуйте использовать Router::parseExtensions('json'); вместо Router::extensions('json');?   -  person Maraboc    schedule 02.11.2015
comment
Но 3-0-migration-guide говорит Router::parseExtensions() удален. Вместо этого используйте Cake\Routing\Router::extensions(). Этот метод должен быть вызван до соединения маршрутов. Он не изменит существующие маршруты.   -  person Mayura Wijewickrama    schedule 03.11.2015
comment
@Maraboc В любом случае я не хочу добавлять расширение для своего URL. Я хочу вывести ответ JSON без расширения .json.   -  person Mayura Wijewickrama    schedule 03.11.2015
comment
Вам нужно передать заголовок, например Accept: application/json, и вы получите вывод в формате json.   -  person Khushang Bhavnagarwala.    schedule 08.12.2015


Ответы (3)


У меня была такая же ситуация, но теперь я нашел решение для этого. Теперь я могу указать URL-адрес запроса без .json и также могу получить данные Json в ответ.

В контроллере приложений добавьте сетевой ответ, который будет обрабатывать ваш ответ.

используйте Cake\Network\Response;

После этого вам нужно преобразовать ввод Json в массив. Поэтому поместите эту функцию getJsonInput() в свой AppController и вызовите ее в initialize().

public function getJsonInput() {
        $data = file_get_contents("php://input");
        $this->data = (isset($data) && $data != '') ? json_decode($data, true) : array();
    }

Теперь в вашем контроллере у вас есть все данные сообщения в $this->data. так что вы можете получить доступ ко всем входам. Вот пример:

class UsersController extends AppController {

    public function index() {

        if ($this->request->is('post')) {
            //pr($this->data);    //here is your all inputs
           $this->message = 'success';
           $this->status = true;
        }
        $this->respond();
    }
}

Теперь в конце вашей функции вам нужно вызвать respond(), который определен в AppController

public function respond() {  
        $this->response->type('json');  // this will convert your response to json
        $this->response->body([
                    'status' => $this->status,
                    'code' => $this->code,
                    'responseData' => $this->responseData,
                    'message'=> $this->message,
                    'errors'=> $this->errors,
                ]);   // Set your response in body
        $this->response->send();  // It will send your response
        $this->response->stop();  // At the end stop the response
    }

Определите все переменные в AppController как

public $status = false;
public $message = '';
public $responseData = array();
public $code = 200;
public $errors = '';

Еще одна вещь, которую нужно сделать, это:

В Response.php (/vendor/cakephp/cakephp/src/Network/Response.php) вам нужно отредактировать одну строку с 586 echo $content; по echo json_encode($content); в функции _sendContent().

Вот и все. Теперь вы можете установить URL-адрес запроса как domain_name/project_name/users/index.

person Pooja Yadav    schedule 15.12.2016

Если кто-то все еще ищет простое решение для ответа json, вот быстрое решение:

добавьте этот метод в свой AppController.php

public function jsonResponse($responseData = [], $responseStatusCode = 200) {

    Configure::write('debug', 0);

    $this->response->type('json');
    $this->response->statusCode($responseStatusCode);
    $this->response->body(json_encode($responseData));
    $this->response->send();
    $this->render(false,false);

}

и вы можете использовать его в любом простом действии

$data = ['status' => 'ok', 'foo' => 'bar'];
$this->jsonResponse($data);

и еще один пример

$data = ['status' => 'failed', 'bar' => 'foo'];
$this->jsonResponse($data, 404);

надеюсь, это поможет :)

person Medo    schedule 15.12.2017

Запросите свои данные с правильным HTTP-заголовком accept Accept: application/json, тогда RequestHandler должен его подобрать.

Заголовок Accept используется HTTP-клиентами, чтобы сообщить серверу, какие типы контента они будут принимать. Затем сервер отправит ответ, который будет включать заголовок Content-Type, сообщающий клиенту, каков фактический тип возвращаемого контента.

Однако, как вы могли заметить, HTTP-запросы также могут содержать заголовки Content-Type. Почему? Что ж, подумайте о запросах POST или PUT. С этими типами запросов клиент фактически отправляет кучу данных на сервер как часть запроса, а заголовок Content-Type сообщает серверу, что это за данные на самом деле (и, таким образом, определяет, как сервер будет их анализировать).

В частности, для типичного запроса POST, полученного в результате отправки HTML-формы, Content-Type запроса обычно будет либо application/x-www-form-urlencoded, либо multipart/form-data.

person Khushang Bhavnagarwala.    schedule 08.12.2015