CakePHP 3.0:响应为json

时间:2015-11-02 11:23:10

标签: php json cakephp url-routing cakephp-3.x

我正在创建一个CakePHP 3.0 REST API。我跟着this instructions (routing in the book)并在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向此网址发送帖子请求

  

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

输出:

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

但是我希望在没有 .json 扩展名的情况下放弃json。提前谢谢你。

3 个答案:

答案 0 :(得分:5)

我有同样的情况,但现在我找到了解决方法。现在我可以在不使用.json的情况下放置请求url,也可以在响应中获取Json数据。

在App控制器中添加网络响应,该响应将处理您的响应。

使用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()

就是这样。现在您可以将请求网址设置为 domain_name/project_name/users/index

答案 1 :(得分:1)

如果有人仍然在寻找简单的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);

希望有所帮助:)

答案 2 :(得分:0)

使用proper HTTP accept header Accept: application/json请求您的数据,RequestHandler应该接收它。

  

HTTP客户端使用Accept标头告诉服务器什么   他们会接受的内容类型。然后服务器将发回一个   响应,其中包含一个告诉客户端的Content-Type标头   返回内容的内容类型实际上是什么。

     

但是,您可能已经注意到,HTTP请求也可以包含   内容类型标头。为什么?好吧,想想POST或PUT请求。   使用这些请求类型,客户端实际上发送了一堆   作为请求的一部分的数据到服务器,以及Content-Type标头   告诉服务器数据实际是什么(并因此确定如何   服务器将解析它。)

     

特别是对于HTML表单产生的典型POST请求   提交时,请求的Content-Type通常是   application / x-www-form-urlencoded或multipart / form-data。