【问题标题】:Building APIs using Laravel returns empty object only when called via javascript ... sometimes使用 Laravel 构建 API 仅在通过 javascript 调用时返回空对象......有时
【发布时间】:2021-08-02 21:34:00
【问题描述】:

我正在使用 VueJS 和 Laravel 构建一个网页,在遇到这个问题之前一切正常。

首先,让我分享一下必要的代码:

<script>
    axios.defaults.headers.common['Content-Type'] = 'application/json'

    var app = new Vue({
        el: '#app',
        methods: {
            getHotelsByCityName: async function () {

                const resp = await axios.get('localhost/api/hotels');
                console.log(resp);
                
            }
        },
    })
</script>

发送请求的 Javascript 代码就这么简单,后端我只是将数据编码为 JSON 格式,然后发送回客户端。

   public function getHotels(Amadeus $amadeus,$destination)
    {
        $hotels =   $amadeus->searchForHotelsByCityOrAirportName($destination);
        return response()->json($hotels);
    }

请注意,我有时会得到数据,有时会得到空对象,事实上,如果我打开网页并继续刷新它,有时我会得到数据,有时我不会,我发现清除浏览器缓存增加了我获得正确数据的机会,因此这可能是一个缓存问题,但究竟缓存了什么?这是怎么回事?

我正在使用 Amadeus API,您知道,当我直接在浏览器中访问 API 链接时,它始终有效。所以后端看起来不错,不知道问题出在哪里。

编辑 1: 我注意到,当我使用 google chrome 开发工具检查请求时,我得到了一个空对象(有时又一次),但是当我用浏览器直接点击 API 时,我又得到了一个空对象工作正常,我在控制台中没有收到任何错误,但我猜这可能是 headers 或 cookies 问题。如果有人可以提供帮助,我将不胜感激。

编辑 2: 我发现如果我等待几秒钟然后执行该方法一切正常,只有当我从 mount() function 调用 getHotelsByCityName 时才会出现问题或任何其他在页面加载后立即执行的方法。

【问题讨论】:

    标签: javascript laravel vue.js caching axios


    【解决方案1】:

    按 F12 或 ctrl+shift+I 在浏览器上打开开发人员工具。并切换到network面板查看浏览器发送的请求和服务器发送的结果。

    我认为getHotelsByCityName()应该写在Vue中的createdmounted部分,以便在页面加载时获取数据。

    【讨论】:

    • 我将编辑问题以包含有关该问题的更多详细信息
    【解决方案2】:

    将 then 用于异步等待

    <script>
        axios.defaults.headers.common['Content-Type'] = 'application/json'
    
        var app = new Vue({
            el: '#app',
            methods: {
                getHotelsByCityName: async function () {
    
                   await axios.get('localhost/api/hotels').then(resp => {
                      console.log(resp)
                   })
                    
                }
            },
        })
    </script>
    

    【讨论】:

    • 我已经编辑了问题以添加更多详细信息,异步等待不是我的问题的原因。
    • @Tarek,您是否使用邮递员测试了您的后端 API?如果是这样,我确实相信它是异步等待问题。在数据返回之前控制响应。为什么你以某种方式数据,但其他方式你不会
    • 我试过了,同样的问题,第一次刷新页面就可以了,第二次就不行了
    • 您检查过状态 200 吗?请提供您的确切代码。
    • 是的,我收到了 200 个状态码,我认为问题在于从 vuejs 中的 mount 函数调用时异步等待立即返回
    猜你喜欢
    • 2021-02-07
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多