使用 Laravel 的 JSONP

Posted

技术标签:

【中文标题】使用 Laravel 的 JSONP【英文标题】:JSONP with Laravel 【发布时间】:2012-11-24 16:54:21 【问题描述】:

浏览器向 Laravel 发送 JSONP 请求,Laravel 将结果返回给浏览器。在浏览器控制台中,我收到警告:

Resource interpreted as Script but transferred with MIME type text/html:

我认为这是由于 JSONP 响应中的标头不正确造成的?应该如何解决这个警告?

PHP

$callback = Input::get('callback');
$result = DB::table('users')->find(123);

return $callback . '(' . json_encode($result) . ')';

Response::JSON($result) 我相信会返回通常的 JSON 响应,而不是带有回调函数名称的 JSONP 变体。

【问题讨论】:

【参考方案1】:

你可以在 Lavavel 4 中做到这一点:(原文:Tu puedes hacer esto en Laravel 4)

Response::json($result)->setCallback(Input::get('callback'));

【讨论】:

【参考方案2】:

您可以在 Response::json() 调用中提供标头。

Response::json($result, 200, array('Content-Type' => 'application/javascript'));

JSONP 的正确 MIME 类型是 application/javascript。

【讨论】:

【参考方案3】:

对于 Laravel(5.1 及以上)或 Lumen(5.1 及以上):

如果你想创建一个 JSONP 响应,除了 setCallback,你还可以使用 JSON 方法:

return response()
    ->json(['name' => 'Abigail', 'state' => 'CA'])
    ->setCallback($request->input('callback'));

【讨论】:

【参考方案4】:
Response::json($result)->setCallback(Input::get('callback'));

正如Raul Duran 所建议的那样更好,因为您不必操纵 $result。

另一个选项是回显,而不是使用响应。

【讨论】:

【参考方案5】:

对于 Laravel>8,创建 JSONP 响应:

return response()
        ->json(['name' => 'Abigail', 'state' => 'CA'])
        ->withCallback($request->input('callback'));

我们应该使用 withCallback() 而不是 setCallback()

根据 Laravel docs

【讨论】:

以上是关于使用 Laravel 的 JSONP的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 使用外部类

laravel中使用的PDF扩展包——laravel-dompdf和laravel-snappy

Laravel快速使用Elasticsearch

laravel和mongo怎么搭配使用

将 VueJS 添加到 Laravel 但继续使用 Laravel 的路由器等

没有composer可以安装或者正常使用laravel么