【问题标题】:Laravel can't return true json responseLaravel 无法返回真正的 json 响应
【发布时间】:2017-08-31 15:49:49
【问题描述】:

我有一个非常简单的 Laravel 控制器:

class MyController extends Controller
{
    public function list()
    {
        return response()->json(['a' => 'hello']);
    }
}

当我尝试在浏览器中打开相应的 url(我使用谷歌浏览器)时,它工作正常。有{"a":"hello"} 响应,内容类型为application/json

但是当我通过 javascript(我使用 fetch polyfill)接收数据时,我看到内容类型是 text/html。我在 GoogleChrome DevTools 和我的代码中检查了它:

fetch("/list")
    .then(function(response) {
        console.log(response.headers.get('Content-Type')); // => 'text/html'
        return response.json();
    })
    .then(function(json) { 

    })
    .catch(function(error){

    });

好吧,我遇到了错误 - Unexpected token < in JSON at position 0

我完全不明白发生了什么。

PS

Laravel 版本 - 5.4、PHP 版本 7.0.15、XAMPP 3.2.2

获取 polyfill 版本 - 2.0.3

谷歌浏览器版本 - 57.0.2987.133

是的,这听起来很奇怪,但在 MS Edge v.20.10240 中它可以正常工作。

【问题讨论】:

  • 您是否查看了开发工具以了解请求响应的内容?服务器可能正在返回带有数据的html
  • “我在 GoogleChrome DevTools 中检查过” - 内容类型是 text/html。那么,问题是为什么?应该是application/json
  • 尝试检查响应是否可用(与您之前所做的相同,但标题旁边应该有一个响应选项卡),每当我看到此错误时,它往往来自服务器以 html 响应出于某种原因
  • 您是否阅读了服务器发送的 HTML 响应的内容?也许这是一个错误页面,带有某种错误消息,表明服务器端在尝试提供响应时存在问题/失败。此外,检查服务器端 web-server/PHP 错误日志以查看是否记录了某些错误

标签: javascript json laravel laravel-5 fetch-api


【解决方案1】:

您需要将请求的标头设置为 json 的内容类型。我不知道 polyfill,但这就是我使用 jquery 的方式

 $.ajax({
                type: 'GET',
                url: url,
                contentType: 'application/json; charset=utf-8',
                success: 
                error: 
            });

【讨论】:

  • 谢谢@victor!邮递员说得很清楚。我对请求的 url 使用 auth。由于某种原因,我在 Chrome 中的响应中有授权页面,但在 Edge 中没有。无论如何,现在我知道问题出在哪里了。
【解决方案2】:

我尝试对所有路由使用session 身份验证。所以,问题就在那里。 api 如下路线帮助我:

Route::middleware('auth:api')->get('/list', 'ApiController@list');

再想一想。我为我的所有请求添加了api_token,如here 所述。

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2014-12-18
    • 2021-01-24
    • 2017-04-19
    • 2019-07-11
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多