CakePHP 3.0: ответ как json

Я создаю CakePHP 3.0 REST API. Я последовал за это инструкция (пойдут в книгу) и получил ответ в 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 расширение. заранее спасибо.

2

Решение

У меня была такая же ситуация, но теперь я нашел решение для этого. Теперь я могу разместить 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,

5

Другие решения

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

добавьте этот метод в ваш 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);

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

1

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

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

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

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

0