2015-11-02 59 views
2

我正在創建一個CakePHP 3.0 REST API。我跟着this instructions (routing in the book)並收到json的迴應。這是我的代碼。CakePHP 3.0:作爲json的響應

01 SRC /配置/ 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發送POST請求到該URL

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

輸出:

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

但我想JSON出來放不以.json擴展。先謝謝你。

+0

嘗試使用'Router :: parseExtensions('json');'而不是'Router :: extensions('json');'? – Maraboc

+2

但是,[3-0-migration-guide says](http://book.cakephp.org/3.0/en/appendices/3-0-migration-guide.html)Router :: parseExtensions()已被刪除。使用Cake \ Routing \ Router :: extensions()代替。該方法必須在連接路由之前調用。它不會修改現有的路線。 –

+1

@Maraboc任何我不想爲我的網址添加擴展名的方法。我想把沒有.json擴展名的JSON響應。 –

回答

0

請求您的數據與proper HTTP accept headerAccept: application/json,RequestHandler應該拿起它然後。

Accept頭被HTTP客戶端用來告訴服務器他們將接受哪些 內容類型。然後,服務器將發回一個 響應,該響應將包含一個Content-Type標頭,告訴客戶端 返回的內容實際是什麼內容類型。

但是,正如您可能已經注意到的那樣,HTTP請求也可以包含 Content-Type標頭。爲什麼?那麼,考慮POST或PUT請求。 對於這些請求類型,客戶端實際上是將一堆 數據作爲請求的一部分發送到服務器,並且Content-Type標頭 告訴服務器數據實際是什麼(並且因此確定服務器將如何分析 它)。

特別是,對於從HTML表格 提交產生的​​典型POST請求,請求的內容類型通常是 application/x-www-form-urlencoded或multipart/form-data。

5

我有同樣的情況,但現在我找到了解決方案。現在我可以把請求的URL沒有.json,也可以得到Json數據。

在應用程序控制器中添加將處理您的響應的網絡響應。

use 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

+0

這太神奇了..你救了我的一天..謝謝你:) – Poonam

+0

'$ this-> response-> type('json');'做了詭計,謝謝! –

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); 

希望可以幫助:)