【发布时间】:2016-06-26 04:20:18
【问题描述】:
我正在开发 Laravel API。我的 Web 应用程序正在向我的 API 发出 GET 请求。但由于 API 设置为子域 (http://api.geladaris.dev/v1/books),我必须使用 JSONP 使跨域 GET 请求工作到此端点。
在客户端,我有一个 polymer element,它生成 GET 请求,服务器应该返回 Laravel 的 jsonp 响应。
Laravel 文档 here 指出,setCallback 方法将像这样链接到响应:
return response()
->json(['name' => 'Abigail', 'state' => 'CA'])
->setCallback($request->input('callback'));
这就是我的Api\BooksController 上的index 方法的样子:
public function index()
{
return response()
->json(['name' => 'Abigail', 'state' => 'CA'])
->setCallback($request->input('callback'));
}
还有我的Routes.php
Route::group(['domain' => 'api.geladaris.dev'], function () {
Route::group(['prefix' => 'v1'], function () {
Route::resource('books', 'Api\BooksController');
});
});
不幸的是,我得到的只是一个500 Internal Server Error,当请求生成并且服务器返回上面的代码时,使用“setCallback”方法:
只有在我使用 setCallback 方法时才会发生这种情况。如果我忽略它,并返回一个正常的json 响应而不是jsonp,则找到该文件,但我没有得到parseResponse,当访问另一个API 时,f.e. http://api.github.com/users 或 http://jsonplaceholder.typicode.com/posts。注意第一行:
我不知道如何从这里开始。我已禁用 CSRF 中间件并在没有任何中间件的情况下运行我的路线。
我也尝试使用 api 中间件,但没有任何积极的结果。
我的下一个方法是安装一个CORS 库并尝试设置正确的响应标头,但我怀疑问题会在那里找到,因为我检查并比较了来自三个不同 API(Google 新闻、Github)的标头, Json Placeholder) 到我的 API,我发现的唯一实质性区别是在实际返回的 JSON 之前缺少 parseResponse。
因此我想知道:如何在 Laravel 中设置 JSONP 响应而不返回 500 服务器错误?
由于错误指示服务器错误,这里向服务器提供一些详细信息:
我正在使用 WAMP。
我的vhost:
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/geladaris/public"
ServerName geladaris.dev
ServerAlias *.geladaris.dev
</VirtualHost>
我的hosts 文件:
127.0.0.1 geladaris.dev
127.0.0.1 api.geladaris.dev
【问题讨论】:
-
您可能应该查看服务器的错误日志。此外,您可以轻松地将 CORS 配置为 JSONP 的替代方案。