Laravel 返回带有额外 ` ' ` 引用的 JSON 响应:" ' "status":500,"m

Posted

技术标签:

【中文标题】Laravel 返回带有额外 ` \' ` 引用的 JSON 响应:" \' "status":500,"m【英文标题】:Laravel returning JSON response with extra ` ' ` quote: " ' "status":500,"mLaravel 返回带有额外 ` ' ` 引用的 JSON 响应:" ' "status":500,"m 【发布时间】:2017-02-12 00:58:32 【问题描述】:

我正在使用 jQuery $.ajax 向我的 Laravel 5.1 API 发送 ajax 请求。

我试图简单地从服务器输出错误响应,但由于responseText 属性值开头的流氓' 导致无法JSON.parse 响应。

为什么会在那里?

前端

API.Auth.register(params).done(function (result) 

    // Do stuff

).error(function (xhr, status, error) 
    console.log('Registration error: ', xhr);
    var parsed_response = JSON.parse(xhr.responseText);
    console.log('parsed_response', parsed_response);
    alertify.error('There was a problem with your registration.');
);

register : function (params)

    return $.ajax(
        url: globals.env.api_host + globals.env.api_ver + '/register',
        type: 'POST',
        data: params,
        dataType: 'json',
        cache: true
    )
,

Laravel 5.1:我尝试将属性包装在 " " 中,但错误结果相同:

public function register(Request $request)

    try 
        $new_user = $this->create($request->all());
     catch (QueryException $e) 
        // error code 23000 is unique SQL unique constraint error - TODO: abstract this checking
        if ($e->getCode() === '23000') 
            return response()->json(['status' => 500, 'message' => 'This e-mail already exists. Try a new e-mail or logging in.']);
         else 
            return response()->json(['status' => 500, 'message' => 'There was an error processing registration.']);
        
    

编辑:我测试了如果我只返回一个字符串,' 是否仍然存在:

    //Original Route:
    //$router->post('/register', 'Auth\AuthController@register');

    $router->post('/register', function () 
        return 'hello world';
    );

回复:'hello world

开头的单引号仍然存在。


旁注:我找不到任何关于在 jQuery ajax 中捕获自定义异常消息的信息。我首选的返回错误的方式是自定义异常:

throw new BadRequestHttpException('There was an error processing registration.');

但是$.ajax 无法捕获异常消息,所以我求助于从 Laravel 返回response()->json...

对此有什么想法吗?


编辑:找到了。有人意外更改了config/app.php 文件并添加了'。奇怪的是,Laravel 仍然通过提供响应来处理这个问题,但在 ' 之前添加。

【问题讨论】:

检查状态文本的响应标头和 $.ajax 错误处理程序参数 @charlietfl laravel.com/docs/5.3/responses#json-responses 表示response()->json(我正在使用)已经将标头类型设置为json。我检查了 ajax 响应中的状态文本,里面有那个流氓 ` ' ` 单引号。见上文 如果发送 400 或 500 系列状态码可以在 ajax 错误处理程序中得到响应消息 我还想指出,您不再需要response()->json() - 返回数组将显示 json。 @Derek 谢谢 - 嗯。任何关于流氓 ' 单引号来自响应开头的任何想法:-->'<--"status":"500","message":"There was an error processing registration." 【参考方案1】:

在进行了大量搜索后,@Derek 建议我检查源代码控制中是否存在诸如 ' 单引号之类的恶意添加。

我发现有人不小心在 config/app.php 文件中提交了 '

PHP 将<php> 标记之外的任何内容都视为输出,因此它被“添加”到任何响应中。

这显然破坏了前端的JSON.parsing,因为响应负载的 JSON 格式不正确。

【讨论】:

以上是关于Laravel 返回带有额外 ` ' ` 引用的 JSON 响应:" ' "status":500,"m的主要内容,如果未能解决你的问题,请参考以下文章

带有额外列的多对多自引用原则

在从laravel ajax返回的json中的每个斜杠中获取额外的反斜杠“\”

验证或删除 laravel 中的额外字段

InternetReadFile 在末尾返回带有额外字符的文本

为啥 SoapClient 在文档/文字样式中使用 WSDL 返回带有额外关键元素的数组?

无需额外过滤即可返回所有带有预输入的远程匹配项