【问题标题】:Ajax Cannot Read JSON POST DataAjax 无法读取 JSON POST 数据
【发布时间】:2016-10-21 01:50:49
【问题描述】:

我有这样的功能:

function pemeliharaan(){
                    var petugas = document.getElementById('petugas').value;
                    $.ajax({
                    type: "POST",
                    url: "http://localhost/sipetan/WebService/public/api/pemeliharaan",
                    data: "[{'id_petugas':'1','no_rek_pelanggan':'11111'}]",
                    dataType: "json",
                    contentType: "application/json"
                }).done(function() { 
                    alert('Pemeliharaan dikirim ke database!');
                }).fail(function() {
                    alert("Input yang anda masukkan salah!");
                    var r=confirm("Ulangi?");
                    if (r)
                    {
                        window.location = "/";
                    }
                    else{};
                });
                  }

但是,Laravel 无法读取我的 JSON 数据。 Laravel 返回:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id_pegawai' cannot be null (SQL: insert into `pemeliharaan` (`id_pegawai`, `no_rek_pelanggan`, `jenis`, `latitude`, `longitude`, `catatan`, `updated_at`, `created_at`) values (, , , , , , 2016-06-19 20:54:26, 2016-06-19 20:54:26))

该函数似乎没有读取我的数据(id_petugas 和 no_rek_pelanggan)。

我尝试将我的数据结构更改为:`

  1. {'id_petugas':'1','no_rek_pelanggan':'11111'}
  2. {'id_petugas':1,'no_rek_pelanggan':11111}
  3. [{'id_petugas':1,'no_rek_pelanggan':11111}]
  4. [{'id_petugas':'1','no_rek_pelanggan':'11111'}]

还是不行。但是当我尝试使用 RESTful 客户端时,它可以完美运行。这是我的 laravel 控制器:

$Pemeliharaan=new pemeliharaan;
        $Pemeliharaan->id_pegawai=Request::input('id_petugas');
        $Pemeliharaan->no_rek_pelanggan=Request::input('no_rek_pelanggan');
        $Pemeliharaan->jenis=Request::input('jenis');
        $Pemeliharaan->latitude=Request::input('latitude');
        $Pemeliharaan->longitude=Request::input('longitude');
        $Pemeliharaan->catatan=Request::input('catatan');

        $success=$Pemeliharaan->save();

        if(!$success)
        {
            return Response::json("error saving",500);
        }    
        return Response::json("success",201);

编辑

当我在我的其他函数上使用 dataform 到 JSON 时,它也可以正常工作:

jQuery('form#postPemeliharaan').bind('submit', function(event){
                event.preventDefault();

                var form = this;
                var json = ConvertFormToJSON(form);

                var id_pemeliharaan;
                $.each(json,function (name, value){
                   if(name=="id_pemeliharaan"){
                    id_pemeliharaan=value;
                   }
                });

                $.ajax({
                    type: "PUT",
                    url: "http://localhost/sipetan/WebService/public/api/pemeliharaan/"+id_pemeliharaan,
                    data: json,
                    dataType: "json"
                }).done(function() { 
                    alert('Pemeliharaan dikirim ke database!');
                }).fail(function() {
                    alert("Input yang anda masukkan salah!");
                    var r=confirm("Ulangi?");
                    if (r)
                    {
                        window.location = "/";
                    }
                    else{};
                });

                return true;
            });

EDIT 2(解决了我自己的问题): 但我将 contentType 更改为 form-data

function pemeliharaan(){
                var petugas = document.getElementById('petugas').value;
                var json = '[{"id_petugas":1,"no_rek_pelanggan":11111}]';
                $.ajax({
                type: "POST",
                url: "http://localhost/sipetan/WebService/public/api/pemeliharaan",
                data: [{"name": "id_petugas","value": 1},{"name": "no_rek_pelanggan","value": 11111},{"name": "longitude","value": 11111},{"name": "latitude","value": 11111},{"name": "jenis","value": 1}],
                dataType: "json",
                contentType: "application/x-www-form-urlencoded"
            }).done(function() { 
                alert(petugas+' berhasil ditugaskan untuk melakukan pemeliharaan');
            }).fail(function() {
                alert("Input yang anda masukkan salah!");
                var r=confirm("Ulangi?");
                if (r)
                {
                    window.location = "/";
                }
                else{};
            });
              }

【问题讨论】:

标签: jquery json ajax laravel


【解决方案1】:

不知道是否只有这些,但我刚刚注意到:

  1. 在您发送给 Laravel 的数据集中,还必须有 CSFR 令牌。这就是为什么我通常将它作为隐藏输入包含在正文之后,并在每个 ajax 请求中使用它的值。

  2. dataType 属性的正确格式是:{'id_petugas':1,'no_rek_pelanggan':11111}

剩下的,我会 xdebug 那个控制器来检查接收到的有效数据。

你是否也尝试过 intval() 那个 ids?

$Pemeliharaan->id_pegawai = intval(Request::input('id_petugas'));

【讨论】:

  • 如果你使用 $request['id_petugas'] 而不是 Request::input('id_petugas')?你有什么?
  • 当我使用 $request 时,laravel 返回了Cannot use object of type Illuminate\Support\Facades\Request as array。另请参阅我的编辑
  • 如果 Input::get('id_petugas') 会怎样?
  • 我的 laravel 5.2 上没有 Input 类。返回Class 'App\Http\Controllers\Input' not found
  • 将此添加到您的控制器:使用 Illuminate\Support\Facades\Input;
【解决方案2】:

您发送的 JSON 无效。您可以通过 json 验证器来证明这一点

你的单引号应该是双引号,反之亦然。

不要手动创建 JSON。大多数语言都有序列化方法可以为你做这件事

试试

 data: JSON.stringify([{'id_petugas':'1','no_rek_pelanggan':'11111'}])

【讨论】:

  • 我已经解决了这个问题,将类型更改为表单数据。请参阅我的编辑 2。但您是这个问题的真正 MVP。右边是data: JSON.stringify({'id_petugas':1,'no_rek_pelanggan':11111})
  • 我想知道为什么它是数组,但由于缺乏更好的理解,只是展示了如何对你拥有的结构进行字符串化
  • 好的。非常感谢。祝你今天过得愉快。上帝祝福你! :)
猜你喜欢
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
相关资源
最近更新 更多