我在尝试检查请求是否为ajax时遇到问题。这是我的代码:
路线
Route::post('cookies-alert', 'CookiesController@weUseCookies')->name('cookies.weuse');
控制器
namespace app\Http\Controllers;
use Illuminate\Http\Request;
class CookiesController extends Controller
{
public function weUseCookies(Request $request)
{
if($request->ajax()){
return response()->json(['status' => 'successful']);
}else{
return response()->json(['status' => 'error']);
}
}
}
表单(使用Laravel集合,它自动创建_token)
{{ Form::open(['route' => ['cookies.weuse', ''], 'method' => 'POST', 'id' => 'cookie-form']) }}
....
<button type="submit">Ok</button>
{{ Form::close() }}
和js
$('#cookie-form').on('submit', function(e){
e.preventDefault();
// .....
$.ajax({
url: url,
method: 'POST',
dataType: 'JSON',
data: data
}).done( function (response) {
var res = response;
if( res.status == 'successful' ){
console.log(res.status);
}else{
showError('error :(');
}
});
});
我试着用另一种方式
$.ajax({
url: url,
type: 'POST',
data: data,
dataType: 'JSON',
success: function (data) {
console.log(data);
}
});
并使用https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
中的jquery 3.2.1但它总是从我的控制器返回“错误”。
我也尝试使用 Request :: ajax(),例如this,但它会跳转if {}并从控制器转到else {}选项。
我做错了什么?
我的代码适用于本地但不适用于服务器
答案 0 :(得分:0)
laravel使用X-Requested-With http标头检查传入请求是否为ajax,您还必须在表单中添加@csrf字段:
$.ajax({
url: url,
type: 'POST',
// add _token field for csrf protection
data: {
_token : ''
},
dataType: 'JSON',
// add x-forwarded-with also add X-CSRF-TOKEN header for csrf protection
headers: {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN': ..,
}
});
或者您可以使用axios,因为laravel可以更好地使用它:
axios({
method: 'POST',
url: 'url',
data: {
_token: 'token',
},
responseType: 'json',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN': 'token,
}
}
答案 1 :(得分:0)
Request::wantsJson()
它也可以与axios一起使用。
答案 2 :(得分:0)
您需要在app.js中设置类似于波纹管的标题
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
window.Vue = require('vue');
答案 3 :(得分:0)
var obj = {
x: 1,
};
obj.arr = new Array(3).fill(obj.x);
console.log(obj);
对我来说,它正在与axios一起使用