![](/img/trans.png)
[英]CodIgniter: why I get html response instead of json response when sending ajax request
[英]Response::json() sending html instead of json
使用 Laravel 4, return Response::json(array('foo' => 'bar'))
在一個 controller 中使用將返回實際的application/json
,而在另一個 controller 中,對於另一個操作,它將返回text/html
。 這兩個操作都是通過 Ajax 調用的。
在錯誤的 controller中,我試圖用這個片段強制內容類型:
[...]
$response = Response::json($data);
$response->header('Content-Type', 'application/json');
$response->header('Content-Foo', 'Bar'); // test if additional headers are really set
Log::info($response);
return $response;
...在工作時 controller返回正確的 Json 響應:
return Response::json($data);
在兩者中, $data
是一個數組(已測試)。
來自故障 controller 的記錄響應是:
HTTP/1.0 200 OK
Cache-Control: no-cache
Content-Foo: Bar
Content-Type: application/json
Date: Wed, 17 Sep 2014 10:55:03 GMT
但收到的響應(在 Firebug / DevTools 中)是:
Connection Keep-Alive
Content-Type text/html
Date Wed, 17 Sep 2014 10:55:03 GMT
Keep-Alive timeout=5, max=93
Server Apache/2.2.25 (Unix) mod_ssl/2.2.25 OpenSSL/0.9.8y DAV/2 PHP/5.5.3
Transfer-Encoding chunked
X-Powered-By PHP/5.5.3
我試圖在錯誤的 controller 操作開始時直接返回Response::json(array('foo' => 'bar'))
但它仍然以text/html
形式發送響應。
我想知道為什么內容類型會無故從application/json
切換到text/html
? 為什么模擬 header 不在收到的響應中?
問題似乎出在驗證器周圍。
public function faultyAction()
{
if(!Request::ajax()) App::abort(405);
$validator = Validator::make(
array('trackfile' => Input::file('trackfile')),
array('trackfile' => 'required|audio')); // audio is a custom validator
if($validator->fails())
{
Log::info('validation failed!');
return Response::json(array('code' => 1, 'message' => 'File validation has failed.'));
}
else
{
Log::info('validation passed!');
return Response::json(array('code' => 0, 'filename' => 'test'));
}
}
...在驗證通過時返回text/html
響應。
public function faultyAction()
{
if(!Request::ajax()) App::abort(405);
$validator = Validator::make(
array('trackfile' => Input::file('trackfile')),
array('trackfile' => 'required|audio')); // audio is a custom validator
return Response::json(array('code' => 0, 'filename' => 'test'));
}
...返回application/json
。
為什么會根據在代碼中的調用位置返回具有不同內容類型的相同響應?
它可能來自$validator->fails()
(即使似乎沒有任何東西改變標頭或在 Laravel 的Validator.php
代碼中打印一些東西)?
嗨,基本上,將Response :: json()與數據數組作為參數就足夠了。 再次定義Content-type頭是沒有用的,Response :: json應該默認將其設置為正確。
我現在在我的項目上創建json響應,到目前為止一切正常。 只是為了清楚起見,有故障的控制器使用錯誤的內容類型標頭返回了正確的值,對嗎? 您可以僅使用Response :: json再試一次,也可以告訴您使用哪個確切的laravel版本嗎?
再次嗨,我正在根據您的回復編輯我的第一個答案:您應該測試以下內容:
$ json = json_encode($ yourArray);
//首先使用var_dump()或Log :: info()檢查$ json變量,看看是否存在空間問題。 然后,您可以創建響應。
$ response = Response :: make($ json,200);
$ response-> header('Content-Type','application / json');
返回$ response;
希望能幫助到你...
OP 可能不是這種情況,但這是對作為 text/html 發送的 json 響應的最佳搜索結果。 我只是花了相當多的時間在 Laravel 9 和 php 8.2 中調試這個問題
錯誤內容類型的一個可能原因隱藏在 php magic goo 中的某處。 換句話說,它如何處理發送響應標頭。
如果您分別在 php 開始或結束標記之前或之后的任何地方有空格,則將發送標頭並且您不能再修改它們。 這就是為什么建議不要在多文件應用程序中使用 php 結束標記,但這對打開標記前的空白沒有幫助:
<?php
現在,如果您的框架(如 Laravel)使用headers_sent()
檢查,則在為您修改標頭之前,結果是 drumm roll: text/html,沒有任何錯誤。
要確定問題,請嘗試使用header()
自己在調用堆棧末尾的某處設置標頭。 然后它應該會失敗並告訴您標頭已發送到哪個文件中。 對我來說,罪魁禍首隱藏在其中一個 lang 文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.