如何从 vue.js axios POST 在 Laravel 中获取 JSON?

Posted

技术标签:

【中文标题】如何从 vue.js axios POST 在 Laravel 中获取 JSON?【英文标题】:How to get JSON in Laravel from vue.js axios POST? 【发布时间】:2021-06-17 13:05:18 【问题描述】:

在我的 Laravel 后端使用 axios 从 vuex 接收 JSON 数据时遇到一些问题。

我有这样的 vuex 存储,我想在点击时将其发送到后端。

 order: 
        delivery_id: null,
        user_id: null,
        is_active: true,
        bill: null,
        name: null,
        surname: null,
        father_name: null,
        phone: null,
        payment_type: 'cash',
        delay: null,
        cashback_paid: null,
        card: null,
        payment_screenshot: null,
        cart: null,
    

在 vue 组件中我有这个方法:

sendOrder() 
  let order = this.$store.state.order.order;
  console.log(order)

  axios
    .post('/api/products', order, 
      header: 
        'Content-Type': 'application/json'
      
    )
    .then((response) => 
      console.log(response);
    )
    .catch((error) => 
      console.log(error);
    )

这是我非常简单的 Laravel 控制器:

$test = json_decode($request->getContent(), true);

$test = $test['payment_type'];

return response($test);

但是当我执行这个 POST 请求时,我收到了空数据作为响应。

另外,我尝试使用 Postman 检查我的 API,它工作正常。我只是发送请求,然后转到 F12 > 网络 > 找到我的请求并复制请求有效负载源数据。然后我将它粘贴到 Postman 正文 (raw, json) 并使用此数据向相同的 url (http://localhost:8000/api/orders) 发出请求,并按预期返回“现金”。所以我决定,这是 vue.js 或 axios 的问题,但我不知道如何解决这个问题。谢谢!

更新 我已经尝试从 axios、JSON.stringify 订单中删除 Content-Type 并得到相同的结果 - 响应为空数据。

【问题讨论】:

【参考方案1】:

我认为,在 axios 中使用 order 之前,您应该对 JSON 数据进行字符串化:

let order = JSON.stringify(this.$store.state.order.order);

一些cmets之后的第二部分答案:

您确定路由文件吗?我会使用声明的函数(例如 mytest)从 web.php 文件(同一文件夹)调用控制器,如下所示:

Route::post('/api/products', 'ProductController@mytest');

并将您的控制器逻辑放入该函数中:

public function mytest()

    $test = json_decode($request->getContent(), true);
    $test = $test['payment_type'];
    return response($test);

如果这不起作用(也与 JSON.stringify 结合使用),我唯一的想法是您的 “非常简单的 Laravel 控制器”中的一个错字 ;)...

【讨论】:

感谢您的回复。我已经尝试过了,但结果相同。我编辑了我的问题并添加了一个更新 - “更新我已经尝试从 axios、JSON.stringify 订单中删除 Content-Type 并且得到了相同的结果 - 响应中的空数据。” 你的 console.log(order) 输出了什么?你的路由文件(可能是'routes/web.php')对'/api/products'有什么作用? 我的 console.log 输出: "delivery_id": 4, "user_id": 1, "is_active": true, "bill": '00-54753', "name": 'Name', "surname": 'Surname', "father_name": 'Name', "phone": '+7777777', "payment_type": "cash", "delay": null, "cashback_paid": null, "card": null, "payment_screenshot": null, "cart": null 和我的 'routes/api.php' Route::resource('/products', ProductController::class); 我在主帖中的控制器代码(没有足够的符号) 哦,多么愚蠢的错误。我使用了错误的 url '/api/products' 而不是 '/api/orders'。很抱歉浪费了您的时间。

以上是关于如何从 vue.js axios POST 在 Laravel 中获取 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

用axios post form symfony访问vue js数据

使用 Axios 将数据从 Vue.js 传递到 PHP

不允许 axios 发布 405 | Laravel + vue.js

如何在axios vue js中添加多个参数

Vue JS Axios Post 请求向 PHP 发送 Null

来自 Axios 405 或 415 错误的 Vue.js 和 .NET WEBAPI2 POST