Как отправить данные формы laravel в контроллер с помощью ajax в API

У меня есть форма, которая открывается в веб-представлении Android, я хочу сохранить данные в базу данных, но когда я делаю вызов ajax и пытаюсь распечатать данные, отображается пустой массив, следующий мой код:

<div class = "card-body card-padding">
    <form id = "submitdataform">
        @csrf
        @foreach($formfields as $key=>$value)
            <input type = "hidden" name = "campaign_id" value = "{{$key}}"/>
            @foreach($value as $attrkey)
                <input type = "hidden" name = "attribute_id[]" value = "{{$attrkey->id}}"/>
                <div class = "row">
                    <div class = "col-md-12">
                        <div class = "form-group">
                            <label class = "pure-material-textfield-outlined w-100">
                                {{--<input placeholder = " " type = "text" required>--}}
                                <?php
                                if ($attrkey->attribute_type == 'alpha') {
                                    echo "<input placeholder=' ' type='text' name='attribute_value[]' required>";
                                } elseif ($attrkey->attribute_type == 'date') {
                                    echo "<input placeholder=' ' type='date' name='attribute_value[]' required>";
                                } elseif ($attrkey->attribute_type == 'numberic') {
                                    echo "<input placeholder=' ' type='number' name='attribute_value[]' required>";
                                }
                                ?>
                                <span>{{$attrkey->attribute_name}}</span>
                            </label>
                        </div>
                    </div>

                </div>
            @endforeach
        @endforeach
        <button type = "button" id = "submitbtn">Submit</button>
    </form>
</div>

Теперь вызов ajax

$("#submitbtn").click(function (event) {
    event.preventDefault();
    var data = $("#submitdataform").serialize();
    $.ajax({
        type: "post",
        url: "savecampaigndata",
        data: {data: data},
        contentType: 'application/x-www-form-urlencoded',
        dataType: 'json',
        success: function (data) {
            // Android.passParams('dashboard');
        },
        error: function (data) {
            // Android.passParams(url);
        }
    });
});

И это метод контроллера, где я хочу получить все свои данные,

public function SaveCampaignData(Request $request)
{
    return response()->json($request->all());
    $data = $request->all();
    $attribute_id = [];
    $attribute_value = [];
    $campaign_id = $data['campaign_id'];
    $user_id = Auth::user()->id;

    foreach ($data as $key => $value) {
        if ($key == "attribute_id") {
            foreach ($value as $attrkey) {
                $attribute_id[] = $attrkey;
            }
        } else {
            if ($key == "attribute_value") {
                foreach ($value as $attrvalue) {
                    $attribute_value[] = $attrvalue;
                }
            }
        }
    }

    $mainArray = array_combine($attribute_id, $attribute_value);
    $currentdate = Carbon::now();
    foreach ($mainArray as $key => $value) {
        DB::table('campaign_attribute_values')->insert(
            [
                'campaign_id'              => $campaign_id,
                'campaign_attribute_id'    => $key,
                'user_id'                  => $user_id,
                'campaign_attribute_value' => $value,
                'created_at'               => $currentdate,
                'updated_at'               => $currentdate,
            ]
        );
    }

    if ($this->CheckSmsLimit() > 0) {
        $this->checkAutoReply($campaign_id, $user_id);
    }

    return redirect()->back()->with('success', 'Request Registered');
//        return response()->json(['status' => true, 'message' => 'Record saved succesfully', 'code' => 200]);
}

Это URL-адрес маршрута почтальона:

https://subdomain.xyz.com/savecampaigndata

Но он дает пустой массив в качестве вывода в моем контроллере.

Кажется, вы забыли добавить поле _token в форму, для csrf, или просто добавить этот маршрут в исключения, но это плохая практика.

lessan 15.03.2019 11:28

@csrf уже добавлен, а также настроен ajax в моем файле приложения

Rishikant Vishwakarma 15.03.2019 11:30

удалить contentType: 'application/x-www-form-urlencoded', из запроса ajax

narayansharma91 15.03.2019 11:33

Я уже пробовал все эти вещи, но не могу отправить данные на контроллер

Rishikant Vishwakarma 15.03.2019 11:33

Одна важная вещь, которую этот файл представления открывает в ** веб-просмотре Android **

Rishikant Vishwakarma 15.03.2019 11:37

попробуйте консольный журнал об успехе и ошибке функции ответа, посмотрите, что он вам дает, посмотрите на код состояния http. Это 500? Это 404? Это 302? Это 200?

lessan 15.03.2019 11:37

Sir@lessan Я звоню по этому адресу почтальоном

Rishikant Vishwakarma 15.03.2019 11:39

Можете ли вы попробовать назвать URL-адрес следующим образом: url: "/savecampaigndata",

pr1nc3 15.03.2019 11:45

да я тоже пробовал

Rishikant Vishwakarma 15.03.2019 11:53

Пожалуйста, не могли бы вы показать данные для $formfields?

Rwd 15.03.2019 12:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
10
3 369
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте добавить '/' в атрибут URL-адреса вызова ajax и добавить атрибут заголовка также в вызов ajax.

Ответ принят как подходящий
$("#submitbtn").click(function (event) {
    event.preventDefault();
    var data = $("#submitdataform").serialize();
    $.ajax({
        type: "post",
        url: "{{ url('savecampaigndata) }}",
        data: {data: data},
        success: function (data) {
            // Android.passParams('dashboard');
        },
        error: function (data) {
            // Android.passParams(url);
        }
    });
});
  1. если вы не хотите отправлять токен csrf

тогда

app/Http/Middleware/VerifyCsrfToken.php

и добавьте URL-адрес этого маршрута в массив исключений

protected $except = [
   'savecampaigndata'
];
  1. если хотите

затем добавить в голову

<meta name = "csrf-token" content = "{{ csrf_token() }}">

и в сценарии

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
    }
});

Похоже, вы получаете пустой ответ из-за csrf. Я вижу, что вы включили его в свою форму, однако, поскольку вы используете serialize, он не будет работать так, как вы ожидаете.

Есть несколько разных способов добавить csrf:

  1. Если ваш скрипт находится внутри вашего блейд-файла, вы можете просто добавить его в объект данных:

    data: {
        data: data,
        _token: "{{ csrf_token() }}",
    },
    

    Или

  2. в соответствии с документация вы можете добавить следующее внутри <head> вашей страницы:

    <meta name = "csrf-token" content = "{{ csrf_token() }}">
    

    а затем включил следующее после того, как вы подключили jQuery:

    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
        }
    });
    

Другие вопросы по теме