簡體   English   中英

Response::json() 發送 html 而不是 json

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM