如何将数组从 XMLHTTPREQUEST API POST 保存到 Laravel 控制器

我想将我的数组保存在从 Javascript XMLHTTP 请求发送的数据库中。


Javascript


function xml2() {

    var xhttp = new XMLHttpRequest();

    xhttp.onreadystatechange = function() {

      if (this.readyState == 4 && this.status == 200) {

        console.log(JSON.parse(this.responseText));   

     }

    };

    xhttp.open("POST", "http://localhost/sekai_adminlte3_rnd/api/rnd/postdata", true);

    var singlevar = {"country_name":"Indonesia","country_code":"ID"}

    xhttp.send(singlevar);    

  }

laravel 中的控制器


public function postdata(Request $request)

{

    

    $country = Country::create([


        'country_code' => $request->get('country_code'),

        'country_name' => $request->get('country_name'),


    ]);


    return $country;


}

使用此代码,我无法保存到数据库。


蓝山帝景
浏览 99回答 2
2回答

动漫人物

来自文档: “您也可以使用该create()方法将新模型保存在一行中。”您使用该create()方法的方式有点错误,因为:“一旦我们使属性可以批量分配,我们就可以使用 create 方法在数据库中插入一条新记录。”因此,要么使用该$country->save();方法而不是return $country您在代码中使用的方法,要么使用更好的方法,使您的Country Model中的字段可填充(可批量分配),例如:class Country extends Model{&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* The attributes that are mass assignable.&nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp;* @var array&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; protected $fillable = ['country_code', 'country_name'];}然后在你的控制器中你可以使用:public function postdata(Request $request){&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $country = Country::create([&nbsp; &nbsp; &nbsp; &nbsp; 'country_code' => $request->get('country_code'),&nbsp; &nbsp; &nbsp; &nbsp; 'country_name' => $request->get('country_name'),&nbsp; &nbsp; ]);&nbsp; &nbsp; // return $country; // this one is not needed at all&nbsp; &nbsp;&nbsp;}该create()方法返回保存的模型实例:链接到文档: https ://laravel.com/docs/7.x/eloquent#mass-assignment现在,再看一下您的代码,绝对不可能没有错误(在您的浏览器控制台中),因为我没有看到随您的请求发送的任何CSRF 令牌,而且该XMLHttpRequest.send()方法不会将您的数据传递给您的 Laravel控制器,因为数据必须采用特定格式。因此,请确保您拥有 CSRF 令牌。最简单的方法是将其包含在您的html head喜欢中:<head>&nbsp; <meta name="csrf-token" content="{{ csrf_token() }}"></head>然后令牌也必须包含在 Javascript 脚本中。您将在下面的脚本中找到它。而且由于您要发送的数据看起来像一个关联的数据数组,因此它应该包含在FormData对象中(作为该send()方法的适当格式),这样您就不会遇到数据格式和获取数据的问题在您的控制器中。所以它会按原样工作。您的脚本应如下所示:<script>function xml2() {&nbsp; &nbsp; var xhttp = new XMLHttpRequest();&nbsp; &nbsp; let token = document.querySelector('meta[name="csrf-token"]').content;&nbsp; &nbsp; xhttp.open("POST", "/sekai_adminlte3_rnd/api/rnd/postdata", true);&nbsp; &nbsp; xhttp.setRequestHeader('X-CSRF-TOKEN', token);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; var singlevar = new FormData;&nbsp; &nbsp; singlevar.append('country_name', 'Indonesia');&nbsp; &nbsp; singlevar.append('country_code', 'ID');&nbsp; &nbsp; xhttp.send(singlevar);}</script>我希望您可以通过上述改进使其工作。如果您的路由和网址都可以,它必须工作。

慕斯王

像这样试试try{&nbsp; &nbsp;$country = new Country();&nbsp; &nbsp;$country->country_code = $request->get('country_code');&nbsp;&nbsp; &nbsp;$country->country_name = $request->get('country_name');&nbsp; &nbsp;$country->save();}catch(\Exception $e){&nbsp; &nbsp;dd($e->getMessage());}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript