一次VUE3 使用axios调用萤石云OpenAPI踩坑经历

通过调用萤石云的获取设备列表功能,我们可以根据 ACCESS_TOKEN 获取该用户下的设备列表。

Python 调用接口

根据接口文档[1],使用Python,很轻松就能获取到该列表,代码如下(该代码用于拼接生成vue代码,这是后文踩坑后的一种权宜之计):

import requests
import jsonurl = 'https://open.ys7.com/api/lapp/device/list'vue_str = r'''    <WelcomeItem><template #icon><ToolingIcon /></template><template #heading>{0}</template>  <a href="/player/?id={1}&template=pcRec" target="_blank">查看视频</a></WelcomeItem>'''# 参数
params = {'accessToken': 'your_access_token','pageStart': '0','pageSize': '40'
}r = requests.post(url, params=params)
json_data = r.json()
for item in json_data['data']:device_info = vue_str.replace('{0}', item['deviceName']).replace('{1}', item['deviceSerial'])print(device_info)

一切非常顺利,于是,我打算在axios里调用该接口,想着也应该相当顺利……
于是我写下了如下代码,并期待着正确的结果。

axios 调用接口

<script setup lang="ts">
import { onMounted } from 'vue';
import WelcomeItem from './WelcomeItem.vue'
import ToolingIcon from './icons/IconTooling.vue'
import axios from 'axios';
import { ACCESS_TOKEN } from '../config/constants';const devices = ref<any>([]);const fetchDevices = async () => {try {const response = await axios.post('https://open.ys7.com/api/lapp/device/list', {accessToken: ACCESS_TOKEN, pageStart: 0, pageSize: 40});if (response.status === 200) {devices.value = response.data.data;console.log(response.data)} else {console.error('Failed to fetch devices:', response.statusText);}} catch (error) {console.error('Error fetching devices:', error);}
};onMounted(() => {fetchDevices();
});</script>
<template><WelcomeItem v-for="(device) in devices" :key="device.id"><template #icon><ToolingIcon /></template><template #heading>{{ device.deviceName }}</template>  <a :href="'/player/?id=' + device.deviceSerial + '&template=pcRec'" target="_blank">回放</a><a :href="'/player/?id=' + device.deviceSerial + '&template=pcLive'" target="_blank">直播</a></WelcomeItem>
</template>

然而,我却等来了:

{"msg": "accessToken过期或异常","code": "10002"
}

accessToken过期或异常
再看我传入的内容
请求负载
也按照对象传入,并没有什么不妥……

显然,这不是我想要的,我的 AccessToken 也明明没有过期(Python程序运行良好)。我苦苦寻觅,百思不得其解,并一度怀疑我拿到的应用类型智能用于服务器后台程序调用(参考百度,区分服务器调用或浏览器调用的不同 AK)。
莫非我的传参方式错了?我陷入了回忆之中……

axios POST 传参方式

1. 传递普通对象

这就是我使用的方式,将数据封装在一个普通 JavaScript 对象中,并将其作为请求体发送给服务器。这种传参方式适用于大多数情况,特别是当我们需要向服务器提交表单数据或其他简单的结构化数据时。例如:

// 假设要发送的数据是一个包含用户信息的对象
const userData = {username: 'john_doe',email: 'john@example.com',age: 25
};axios.post('/api/users', userData).then(response => {console.log(response.data);}).catch(error => {console.error(error);});

2. 传递FormData对象

上传文件或者发送包含文件和表单数据的请求时,可以使用 FormData 对象。FormData 对象可以方便地构建一个键值对集合,并在发送请求时将其作为请求体。

// 使用 FormData 对象来上传文件或表单数据
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('title', 'My File');axios.post('/api/upload', formData, {headers: {'Content-Type': 'multipart/form-data' // 设置请求头,确保服务器正确解析 FormData}
}).then(response => {console.log(response.data);}).catch(error => {console.error(error);});

3. URL参数传递

查询字符串传参,在我看来最淳朴,最直接的方式,但这种URL传参我一直认为有点原始,当然也可以使用URLSearchParams 对象用于简化传递 URL 参数的过程。它允许我们使用一种更简洁的方式来指定 URL 参数,而无需手动构造 URL 查询字符串。

// 使用 URLSearchParams 对象来简化传递 URL 参数
const params = new URLSearchParams();
params.append('search', 'keyword');axios.post('/api/search', params).then(response => {console.log(response.data);}).catch(error => {console.error(error);});

当然,除了这些传参方式,也可以设置请求配置,具体也可看文档,我也尝试纠结于方式1并不断改配置时,我再看了萤石云官网文档一眼,仅此一眼,我用上了它正确的打开方式……
HTTP请求报文
壮哉我大&哥,&在了,?就不远了……这是不是意味着方式三才是接口调用的正确打开方法?talk is cheap,show you the code

const fetchDevices = async () => {try {const response = await axios.post(`https://open.ys7.com/api/lapp/device/list?accessToken=${ACCESS_TOKEN}&pageStart=0&pageSize=40`);if (response.status === 200) {devices.value = response.data.data;console.log(response.data)} else {console.error('Failed to fetch devices:', response.statusText);}} catch (error) {console.error('Error fetching devices:', error);}
};

果然,成功了:
查询字符串
响应
页面效果

总结

接口的调用,真的要认真看官方文档啊,不过这个也太隐晦、太坑了吧,如果有示例代码就最好了,也可能是我最开始用Python调用,形成了习惯了。
另:配上个后台,我认为在后台和这些接口对接,然后前端页面访问自己搭建的后台,才是更好的方式。

参考资料

    1. 萤石云获取设备列表文档
    1. Axios 的 post 请求如何使用?传参写法有哪几种?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 969 (Div. 2) 题ABC详细题解,包含(C++,Python语言描述)

前言&#xff1a; 首先让我们恭喜tourist创造历史 他是第一&#xff0c;他又是第一&#xff0c;他总是第一&#xff0c;第一个codefores上4000分的&#xff0c;创造一个新的段位:Tourist&#xff0c;他的名字就是一个新的段位&#xff0c;他就是最高的山&#xff0c;最长的河 本…

访问win10共享文件夹:用户或密码不正确 以及 未授予用户在此计算机上的请求登录类型

因为安装的是神州网信政府版&#xff0c;该版本通常包含更严格的安全策略和访问控制&#xff0c;设置了共享文件夹后&#xff0c;访问共享文件夹时出现错误。 1、首先报错&#xff1a;用户或密码不正确 将》网络访问&#xff1a;本地账户的共享和安全模型&#xff0c;修改为&a…

开源通用验证码识别OCR —— DdddOcr 源码赏析(二)

文章目录 前言DdddOcr分类识别调用识别功能classification 函数源码classification 函数源码解读1. 分类功能不支持目标检测2. 转换为Image对象3. 根据模型配置调整图片尺寸和色彩模式4. 图像数据转换为浮点数据并归一化5. 图像数据预处理6. 运行模型&#xff0c;返回预测结果 …

Python测试之测试覆盖率统计

本篇承接上一篇 Python测试框架之—— pytest介绍与示例&#xff0c;在此基础上介绍如何基于pytest进行测试的覆盖率统计。 要在使用 pytest 进行测试时检测代码覆盖率&#xff0c;可以使用 pytest-cov 插件。这个插件是基于 coverage.py&#xff0c;它能帮助你了解哪些代码部…

人工智能和机器学习5 (复旦大学计算机科学与技术实践工作站)语言模型相关的技术和应用、通过OpenAI库,调用千问大模型,并进行反复询问等功能加强

前言 在这个日新月异的AI时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术正以前所未有的速度改变着我们的生活方式和工作模式。作为这一领域的佼佼者&#xff0c;OpenAI不仅以其强大的GPT系列模型引领风骚&#xff0c;还通过其开放的API接口&#xff0c;让全球开…

哈工大-操作系统L30

文件使用磁盘的实现 fd文件描述符 buf内存缓冲区 count读写字符的个数 file->inode获得inode file_write写文件 inode映射表 读写的内存缓冲区buf,file字符流的位置200-212,根据inode提供的索引号找到块号,根据buf形成请求队列&#xff0c;再放入电梯队列 fseek调整读…

Jenkins安装使用详解,jenkins实现企业级CICD流程

文章目录 一、资料1、官方文档 二、环境准备1、安装jdk172、安装maven3、安装git4、安装gitlab5、准备我们的springboot项目6、安装jenkins7、安装docker8、安装k8s&#xff08;可选&#xff0c;部署节点&#xff09;9、安装Harbor10、准备带有jdk环境的基础镜像 三、jenkins实…

力扣1235.规划兼职工作

力扣1235.规划兼职工作 动态规划 二分 将所有工作按照结束时间排序f[i]表示前i个工作可获取的最大收益状态转移&#xff1a;取第i个工作&#xff0c;f[i] profit[i] f[j]&#xff0c;其中j为结束时间小于i的开始时间的最大数不取第i个工作&#xff0c;f[i] f[i-1]可以通过二…

低代码开发平台:重塑未来软件开发格局的关键力量

低代码开发平台正以前所未有的速度改变着软件开发的面貌&#xff0c;通过最小化手动编码&#xff0c;让用户能够迅速构建应用程序。随着企业对敏捷性和创新能力的追求日益增强&#xff0c;这类平台的需求激增。展望未来&#xff0c;技术进步与市场动态将引领低代码开发进入新的…

大阪OSAKA分子泵TG710MTG730TG1130TD7111TG2810TD3211TG3413手侧接线图

大阪OSAKA分子泵TG710MTG730TG1130TD7111TG2810TD3211TG3413手侧接线图

window下kafka3启动多个

准备工作 我们先安装好kafka&#xff0c;并保证启动成功&#xff0c;可参考文章Windows下安装Kafka3-CSDN博客 复制kafka安装文件 kafka3已经内置了zookeeper&#xff0c;所以直接复制就行了 修改zookeeper配置文件 这里我们修改zookeeper配置文件&#xff0c;主要是快照地址…

【MyBatis】MyBatis的一级缓存和二级缓存简介

目录 1、一级缓存 1.1 我们在一个 sqlSession 中&#xff0c;对 User 表根据id进行两次查询&#xff0c;查看他们发出sql语句的情况。 1.2 同样是对user表进行两次查询&#xff0c;只不过两次查询之间进行了一次update操作。 1.3 一级缓存查询过程 1.4 Mybatis与Spring整…

switch语句和while循环

switch语句和while循环 switch语句break的用法default的用法switch语句中的case和default的顺序问题 while语句while语句的执行流程while语句的具体例子 switch语句 switch 语句是⼀种特殊形式的 if…else 结构&#xff0c;用于判断条件有多个结果的情况。它把多重 的 else if…

滚动视图ScrollView

activity_scroll_view.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

【Python系列】 Python 中的枚举使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

合宙LuatOS开发板使用手册——Air700EAQ

EVB-Air700EL&700EY 开发板是合宙通信推出的基于 Air700EL&700EY 模组所开发的&#xff0c; 包含电源&#xff0c;SIM 卡&#xff0c;USB&#xff0c;PCB 天线等必要功能的最小硬件系统。 以方便用户在设计前期对 模块进 行性能评估&#xff0c;功能调试&#xff0c;软…

如何让“相信相信的力量”帮你多赚100万

公门洞开纳百川 众心逐梦越千山 号召引领潜力绽 心觉潜意识无间 我们经常听到这句话&#xff1a;相信相信的力量 为什么要相信相信的力量 相信是什么意思 相信的力量又是什么意思 我估计99%的人不知道这句话的底层逻辑是什么 如果你悟透了&#xff0c;你的并且践行了&…

PE文件结构详解(非常详细)

最近在参考OpenShell为任务栏设置图片背景时&#xff0c;发现里面使用了IAT Hook&#xff0c;这一块没有接触过&#xff0c;去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解&#xff0c;索性将PE文件结构的资料找出来&#xff0c;系统学习一下。 PE文件结构 Portable…

【Qt】 QDateTimeEdit | QDial

文章目录 QDateTimeEdit —— 时间日期 微调框QDateTimeEdit 属性核心信号QDateTimeEdit 的使用 QDial —— 按钮QDial 属性核心信号QDial 使用 QDateTimeEdit —— 时间日期 微调框 QDateTimeEdit 属性 QDateTimeEdit 作为 时间日期 的 微调框 dateTime —— 时间⽇期的值…

minio文件存储+ckplayer视频播放(minio分片上传合并视频播放)

文章目录 参考简述效果启动minio代码配置类RedisConfigWebConfigMinioClientAutoConfigurationOSSPropertiesapplication.yml 实体类MinioObjectResultStatusCodeOssFileOssPolicy 工具类FileTypeUtilMd5UtilMediaTypeMinioTemplate 文件分片上传与合并MinioFileControllerMini…