Я создаю 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
выход:
{
"status": "o",
"status_message": "ok"}
Но я хочу, чтобы Джонс вышел без .JSON расширение. заранее спасибо.
У меня была такая же ситуация, но теперь я нашел решение для этого. Теперь я могу разместить 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
,
Если кто-то все еще ищет простое решение 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);
надеюсь, это поможет 🙂
Запросите ваши данные с правильный 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.