【问题标题】:Why am I getting HTML response from jquery ajax call为什么我从 jquery ajax 调用中得到 HTML 响应
【发布时间】:2019-05-09 12:36:00
【问题描述】:

我正在尝试在我的 Laravel 项目中使用 jQuery UI 自动完成功能来在用户输入时显示一些建议。这是用户输入时触发的脚本:

$(".autocomplete").autocomplete({
source: function(request, response) {
    $.ajax({
        url: '/autocomplete',
        dataType: "json",
        data: {
            term : request.term,
            field : $(this.element).prop("id")
        },
        success: function(data) {
            console.log(data);
            response(data);
        },
        error: function(result, status, error) {
            console.log(result);
            console.log(status);
            console.log(error);
        }
    });
},
min_length: 0, });

这是我在 web.php 中的路线

Route::get('/autocomplete', 'SitesController@autocomplete');

最后是我的控制器,它从数据库中检索结果。

public function autocomplete(Request $request) {
    $term = \Request::get('term');
    $field = \Request::get('field');
    $sites = Site::where($field, 'ILIKE', '%'.$term.'%')
    ->distinct()
    ->get([$field]);

    $data = [];
    foreach($sites as $key => $site) {
        $data[] = $site->$field;
    }

    return \Response::json($data);
}

目前这个不行,但是当我直接将上面的代码添加到我的路由文件中时,它确实可以正常工作。

Route::get('/autocomplete', function()
{
    $term = \Request::get('term');
    $field = \Request::get('field');
    $sites = Site::where($field, 'ILIKE', '%'.$term.'%')
    ->distinct()
    ->get([$field]);

    $data = [];
    foreach($sites as $key => $site) {
        $data[] = $site->$field;
    }

    return \Response::json($data);
});

我的脚本正在返回一个 HTML 响应,这是我从控制台得到的错误:

SyntaxError: Unexpected token < in JSON at position 0
    at parse (<anonymous>)
    at ajaxConvert (VM258 app.js:18060)
    at done (VM258 app.js:18530)
    at XMLHttpRequest.<anonymous> (VM258 app.js:18832)

我不明白为什么我的脚本没有返回 JSON 而是返回 HTML,而当我将脚本放入 web.php 文件时它确实如此。

【问题讨论】:

  • 检查您的开发者控制台中的网络选项卡,并查看请求的响应选项卡以准确了解它返回的内容。它可能会抛出错误而不是返回 json。
  • 您很可能在控制器中抛出错误或尝试访问它。由于内联代码有效,我首先检查原始路由是否正确访问控制器类,我敢打赌它缺少命名空间或路径错误

标签: php jquery json ajax laravel


【解决方案1】:

正如 aynber 所建议的那样,仔细查看返回的 HTML 页面,我意识到这是一个错误页面,当有人试图在没有权限的情况下访问页面时,由于中间件,我抛出了这个错误页面。我的控制器当然首先检查这个中间件。我为自动完成功能做了一个例外,现在一切正常,尽管我觉得我没有以好的方式处理我的中间件......

【讨论】:

    【解决方案2】:

    在app/Exceptions/Handler.php 文件中你可以做这样的事情

    public function render($request, Exception $e)
    {
        if ($request->wantsJson()) {
            $response = ... // put your response data here
            return response()->json($response);
        }
        ...
    }
    
    

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 2020-12-12
      • 2017-09-10
      • 2015-07-09
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 2012-11-21
      相关资源
      最近更新 更多