Ajax Post Funktioniert nicht in laravel 5.1
Ich bin versucht, post-Daten mit ajax in laravel aber es scheint nicht zu arbeiten. Ich habe folgende ist mein code
login.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="csrf_token" content="{{ csrf_token() }}" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<style type="text/css">
</style>
<script type="text/javascript">
$(document).ready(function(){
$('.send-btn').click(function(){
console.log($('input[name=email]').val());
$.ajax({
url: 'login',
type: "post",
data: {'email':$('input[name=email]').val(), '_token': $('input[name=_token]').val()},
success: function(data){
console.log($('input[name=email]').val());
alert(data);
}
});
});
});
</script>
</head>
<body>
<div class="secure">Secure Login form</div>
{!! Form::open(array('url'=>'account/login','method'=>'POST', 'id'=>'myform')) !!}
<div class="control-group">
<div class="controls">
{!! Form::text('email','',array('id'=>'','class'=>'form-control span6','placeholder' => 'Email')) !!}
</div>
</div>
<div class="control-group">
<div class="controls">
</div>
</div>
{!! Form::button('Login', array('class'=>'send-btn')) !!}
{!! Form::close() !!}
</body>
</html>
und route.php
Route::get('account/login', function() {
return View::make('login');
});
Route::post('account/login', 'AccountController@login');
und im controller
public function login() {
//Getting all post data
if(!Request::ajax()) {
$data = Input::all();
print_r($data);
}
}
Immer wenn ich versuche ein Formular Einreichen, der nicht funktioniert. Ich habe versucht, mit Warnmeldung bei onclick jquery, aber es zeigt die Warnmeldung an. Kann jemand sagen warum es nicht funktioniert?
Hinweis: Diese Frage bereits gefragt, aber keine gefunden Antwort hilfreich für mich
Laravel 5.1 ajax nicht funktioniert?
Update
<script type="text/javascript">
$(document).ready(function(){
$('.send-btn').click(function(){
console.log($('input[name=email]').val());
$.ajax({
url: 'login',
type: "post",
data: {'email':$('input[name=email]').val(), '_token': $('input[name=_token]').val(),'_method': 'POST'},
success: function(data){
console.log($('input[name=email]').val());
alert(data);
}
});
});
});
</script>
In der security console bekomme ich folgende Fehlermeldung
[HTTP/1.0 500 Internal Server Error 115ms]
Update 2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="csrf_token" content="{{ csrf_token() }}">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<style type="text/css">
</style>
<script>
$(document).ready(function() {
$('#frm').on('submit', function (e) {
alert();
e.preventDefault();
var title = $('#title').val();
var body = $('#body').val();
var published_at = $('#published_at').val();
$.ajax({
type: "POST",
url: 'http://localhost/demo/public/articles/articles',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
dataType: 'JSON',
data: {title: title, body: body, published_at: published_at},
success: function( data ) {
$("#ajaxResponse").append(data.msg);
alert(data);
}
});
});
});
</script>
</head>
<body>
{!! Form::open(['url' => 'articles', 'id' => 'frm']) !!}
<p>
{!! Form::label('title', 'Title:') !!}
{!! Form::text('title') !!}
</p>
<p>
{!! Form::label('body', 'Body:') !!}
{!! Form::textarea('body') !!}
</p>
<p>
{!! Form::label('published_at', 'Date:') !!}
{!! Form::input('date', 'published_at', date('Y-m-d'), ['class' => 'form-control']) !!}
</p>
<p>
{!! Form::submit('Submit Article', ['id' => 'submit']) !!}
</p>
{!! Form::close() !!}
</body>
</html>
route.php
Route::resource('articles', 'ArticlesController');
Artikel controller
public function store()
{
print_r(Request::all());
}
Update 2
[2015-08-28 06:23:03]
local.ERROR: exception 'Illuminate\Session\TokenMismatchException' in D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php:53
Stack trace:
#0 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#1 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array)
#2 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php(54): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#3 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#4 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array)
#5 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#6 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#7 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array)
#8 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#9 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#10 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array)
#11 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\EncryptCookies.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#12 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#13 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array)
#14 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php(42): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#15 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#16 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array)
#17 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#18 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#19 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(122): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#20 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(87): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#21 D:\xampp\htdocs\demo\public\index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#22 {main}
- "Immer wenn ich versuche auf "Absenden" funktioniert nicht" — Das sagt uns sehr wenig. Was nicht funktioniert? Verwenden Sie die developer tools (die Konsole und die Netto-Registerkarte im besonderen) in Ihrem browser. Macht die Funktion ausführen? Gibt es Fehler? Gelangt die Anfrage gemacht? Ist es so formatiert, wie Sie es erwarten? Haben Sie eine Antwort bekommen? Ist die Antwort formatiert, wie Sie es erwarten? Wenn Sie eine Anfrage an den HTTP-Endpunkt manuell ein, funktioniert es? Können Sie das problem einzugrenzen, um entweder die JS oder PHP?
- was die logs sagen über diesen Fehler?
- ändern Sie auch
url: 'http://localhost/demo/public/articles/articles'
und legen Sie es aufurl: 'http://localhost/demo/public/articles',
- für den Hinweis.aber bekomme immer noch denselben Fehler
- wie über die Protokolle? 500 Fehler kann verursacht werden, durch eine Tonne von Gründen
- ich habe screenshot
- Sie wissen, anser für diese Frage.können Sie post.
stackoverflow.com/questions/31934494/... - Nein mein Freund, der screenshot sagt nicht zu viel. Überprüfen Sie die Letzte Ausnahme Fehler gedruckt am
/storage/logs/laravel-aug-28.log
- Lassen Sie uns weiter, diese Diskussion im chat.
- Sollten Sie keine post zu
url: 'account/login',
? Ich denke auch, dass man übergeben Sie das token in den Körper Datendata: {_token: CSRF_TOKEN},
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du machst mehrere Fehler:
1-Ihre csrf-token wird im meta-tag (nicht im input-Bereich):
2-meta-tag-name ist csrf_token (aber Sie nennen Sie mit falschen Namen ich.e _token)
3 - csrf-token ist nicht im value-Attribut, aber es ist im content-Attribut
Also muss man es so nennen
Dennoch ist Es viel einfacher Weg, dies zu tun, wie unten gezeigt:
Auch nicht notwendig:
Verwenden Sie diese Anweisung statt:
Vollständigen Beispiel:
Form ist perfekt zu arbeiten.
Du nur vergessen zu senden
"_method": "post"
in Ihrer ajax-Formular-Daten.Laravel ist mit Symfony routing, bei dem mit einem speziellen parameter aufgerufen _ Methode um die route zu Ihrer route definition.
type
parameterWas ich sehe, ist eine falsche url aufgerufen ajax-definition sein sollte:
Der oben angegebenen url gespeichert werden sollte ein Artikel. Für post-login, die Sie verwenden sollten:
Als Hinweis, wenn Ihre website wird eine änderung der domain-url, könnten Sie initialisieren die url via javascript im header:
Dann können Sie es nennen wie:
Ich bin zu bemerken, ein paar Dinge, rechts von der Fledermaus. In Erster Linie müssen Sie festlegen, Ihre POST-route (in routes.php) auf 'Konto/login', aber Sie setzen Ihre $.ajax url auf 'login'. Sie müssen, um es zu "/account/login', gerade wie Sie es in Ihrem Formular-url und (am wichtigsten) - Routen-Datei.
Auch, weil Sie mit dem Laravel {!! Form::xxx() !!} Struktur, Sie brauchen nicht zu zählen 'method'=>'POST'. Hinzugefügt werden für Sie automatisch, so wird der CSRF-Token. http://laravelcollective.com/docs/5.0/html#opening-a-form
Auch, die 'login' - Funktion im Controller wird nur ausgeführt, wenn die Anforderung nicht AJAX, aber Sie versuchen, zu senden, durch ein AJAX-request, richtig? Nur ein paar Dinge zu vertiefen. Hoffe, es hilft.
Wie Sie sehen können aus die Ausnahme, du hast ein problem mit das CSRF-token. Also irgendwie bist du nicht in der Lage zu senden, die den token, das ist, was müssen Sie aufspüren.
In der ursprünglichen Frage, bevor Sie die updates, die Sie versenden den token aus dem versteckten Formular-element wie:
'_token': $('input[name=_token]').val()
Form::open
soll, fügen Sie das Feld in der form, aber wahrscheinlich gab es ein problem, so würde ich Ihnen raten, betrachten Sie die Quelle der Seite, um sicherzustellen, dass es ein verstecktes Formular-element wie<input type="hidden" name="_token" value="asdfasfd">
.Und/oder Sie können einfach geben Sie
$('input[name=_token]').val()
im browser-Konsole, um sicherzustellen, dass Sie erreichen können, ist der Wert.Nach 'update 2' Sie beschlossen, sich zu bewegen das CSRF-token, um die meta-tag und senden Sie es mit dem Header, sondern der name der meta ist
csrf_token
aber Sie verweisen Sie in der $.ajax-Optionen wiecsrf-token
(Bindestrich statt Unterstrich verwendet wird).Beiden Fällen beste Weg, um track down das Problem ist Sie, in Ihrem Browser-Konsole wirksam:
_token
Feld -oder -X-CSRF-TOKEN
- header und, wenn Sie leer sind oder nicht.Ich denke, dass das problem in
App/Http/Middleware/Authenticate.php
Versuchen Sie, dieseZu diesem:
Das problem ist, dass Sie über eine URL anstelle einer direkten Pfad. Laravel ziemlich übersteuert und leitet alles http post-oder get. Öffnen Sie Ihren Browser, Entwickler-tools und betrachten Sie die Anfrage, die URL, das war tatsächlich beantragt ist, anders als das in deinem ajax-Aufruf.
Siehe Beispiel unten die vollständige URL FUNKTIONIERT NICHT. Absoluter Pfad ist.