错误422使用Laravel发布Ajax

时间:2015-09-24 09:13:38

标签: javascript php jquery ajax

我正在尝试使用Laravel 5创建一个简单的Ajax帖子。我读到Csrf令牌匹配存在问题,我可以将我的uri放入VerifyCsrfToken预测中以解决此问题。这部分功能,但是现在我发帖时遇到422错误。

enter image description here

enter image description here

我的代码中有什么东西搞砸了吗?我怎样才能使这个工作?这就是我所拥有的:

HTML:

<div class = "q-form">
                    {!!Form::open(array('url' => 'questions')) !!}
                        <div class = "form-group">
                            {!! Form::hidden('user_id', $myid, ['class' => 'form-control']) !!}
                            {!!Form::label('title', 'Title:')!!}
                            {!!Form::text('title', null, ['class'=> 'form-control'])!!}

                            {!!Form::label('question', 'Question:')!!}
                            {!!Form::textarea('question', null, ['class'=> 'form-control area', 'placeholder' => 'What would you like to ask?'])!!}


                        {!!Form::submit('Ask!', ['class'=> 'btn btn-danger form-control ask'])!!}
                        </div>
                    {!! Form::close() !!}
                </div>

JS:

$('.ask').click(function(e) {

       e.preventDefault();

       var postData = $(this).serializeArray();

       var base_url = 'http://rem-edu-es.eu1.frbit.net/';
       $.ajax({
           type: "POST",
           url: base_url + "questions",
           data: postData,
           success: function (data) {
               console.log(data);
           }

       });
   });

控制器:

 public function book()
{

    if(Request::ajax()){

        return Response::json(Input::all());

    }
}

VerifyCsrfToken:

  class VerifyCsrfToken extends BaseVerifier
{

    protected $except = [
        'book/*',
        'book',
         'questions'

    ];
}

3 个答案:

答案 0 :(得分:3)

在响应中处理对象时出错。

error :function( data ) {
        if( data.status === 422 ) {
            var errors = $.parseJSON(data.responseText);
            $.each(errors, function (key, value) {
                // console.log(key+ " " +value);
            $('#response').addClass("alert alert-danger");

                if($.isPlainObject(value)) {
                    $.each(value, function (key, value) {                       
                        console.log(key+ " " +value);
                    $('#response').show().append(value+"<br/>");

                    });
                }else{
                $('#response').show().append(value+"<br/>"); //this is my div with messages
                }
            });
          }

enter image description here

答案 1 :(得分:2)

验证失败时,

422是默认响应。 处理ajax响应时,需要处理“成功”和“错误”。我的代码示例:

$.ajax({
    url: $(this).data('url'),
    type: "post",
    dataType: "json",
    data: values,
    success: function (data) {
        $('#list').append(data.view);
    },
    error: function (data) {
        var errors = $.parseJSON(data.responseText);
        $.each(errors, function (key, value) {
            $('#' + key).parent().addClass('error');
        });
    }
});

顺便说一句,你可以在你的ajax帖子中传递 _token 参数,然后就不需要禁用CSRF保护了。只需添加一个隐藏的输入

{!! Form::token() !!}

在您通过ajax发送到服务器的表单中。

答案 2 :(得分:-1)

尝试在回复中添加状态代码:

public function book()
{
    if(Request::ajax()){
        return Response::json(Input::all(), 200);
    }
}