当前位置: 首页 > news >正文

腾讯位置服务学习记录

1.跨域

遇到的第一个“天灾”就是需要跨域:

utils/jsonp.ts

// eslint-disable-next-line func-names
export const jsonp = function (url: string, data: { [x: string]: any; key?: string; output?: string; sig?: string }) {
  return new Promise((resolve, reject) => {
    // 1.初始化url
    const dataString = !url.includes('?') ? '?' : '&';
    // eslint-disable-next-line no-param-reassign
    url += `${dataString}callback=jsonpCallback`;
    if (data) {
      // 2.有请求参数,依次添加到url
      // eslint-disable-next-line guard-for-in
      for (const k in data) {
        // eslint-disable-next-line no-param-reassign
        url += `&${k}=${data[k]}`;
      }
    }

    const scriptNode = document.createElement('script');
    scriptNode.src = url;

    // 3. callback
    window.jsonpCallback = (result: any) => {
      // eslint-disable-next-line @typescript-eslint/no-unused-expressions, prefer-promise-reject-errors
      result ? resolve(result) : reject('没有返回数据');
      delete window.jsonpCallback;
      document.body.removeChild(scriptNode);
    };

    // 4. 异常情况
    scriptNode.addEventListener(
      'error',
      () => {
        // eslint-disable-next-line prefer-promise-reject-errors
        reject('接口返回数据失败');
        delete window.jsonpCallback;
        document.body.removeChild(scriptNode);
      },
      false
    );

    // 5. 开始请求
    document.body.appendChild(scriptNode);
  });
};

这里有两点:

①:如果是ts出现的问题,但不影响流程,能用快速修复就用。

②:学到了一个新东西。关于TypeScript 扩展全局 Window 时报错「类型“Window & typeof globalThis”上不存在属性“xx”」的解决方案【TS+已解决】-CSDN博客

declare global {
  export interface Window {
    /** NProgress instance */
    NProgress?: import('nprogress').NProgress;
    /** Loading bar instance */
    $loadingBar?: import('naive-ui').LoadingBarProviderInst;
    /** Dialog instance */
    $dialog?: import('naive-ui').DialogProviderInst;
    /** Message instance */
    $message?: import('naive-ui').MessageProviderInst;
    /** Notification instance */
    $notification?: import('naive-ui').NotificationProviderInst;
    /** jsonp */
    jsonpCallback: any;
  }

  export interface baseParams {
    [key: string]: any;
  }

  /** Build time of the project */
  export const BUILD_TIME: string;
}

2.sig签名验证

签名验证我真的找了挺多的文档去看,相关文档如下:
常见问题 | 腾讯位置服务

vue3 腾讯地图 WebServiceAPI 使用签名检验 jsonp获取数据_腾讯地图怎么使用签名-CSDN博客

 最后我写的代码为:

onst getLocation = async () => {
  const publicKey = 'KEY';
  const secretKey = 'SK';

  const param: { [key: string]: any } = {
    key: publicKey,
    output: 'jsonp',
    callback: 'jsonpCallback'
  };

  const sortedParams = Object.keys(param)
    .sort()
    .map(k => `${k}=${encodeURIComponent(param[k])}`)
    .join('&');

  const sigStr = `/ws/location/v1/ip?${sortedParams}${secretKey}`;
  let sig = md5(sigStr);
  sig = encodeURI(sig);
  // 添加签名到请求参数
  const finalParams = {
    key: publicKey,
    output: 'jsonp',
    sig
  };
  // 发送请求
  const res: any = await jsonp('https://apis.map.qq.com/ws/location/v1/ip', { ...finalParams });
  location.value = `${res.result.location.lat},${res.result.location.lng}`;
  updateSearchParams({
    location: location.value
  });
  getData();
};

这里是把jsonpCallback写死了。。。

import { md5 } from 'js-md5';

import { jsonp } from '@/utils/jsonp';

onMounted(() => getLocation());

相关文章:

  • 汇编学习之《变址寄存器》
  • 下载安装mingw配置C++编译环境 及C环境
  • 深入理解 YUV 颜色空间:从原理到 Android 视频渲染
  • 【前端】创建一个vue3+JavaScript项目流程
  • 指纹浏览器技术解析:如何实现多账号安全运营与隐私保护
  • 横扫SQL面试——时间序列分组与合并(会话划分)问题
  • 3.27-1 pymysql下载及使用
  • win10之mysql server 8.0.41安装
  • 从像素到二值化:OpenCV图像处理实战入门指南
  • 虫洞数观系列二 | Python+MySQL高效封装:为pandas数据分析铺路
  • Spring Boot中常用内嵌数据库(H2、HSQLDB、Derby)的对比,包含配置示例和关键差异总结
  • PyTorch量化进阶教程:第一章 PyTorch 基础
  • 如何分辨三极管的三个极
  • leetcode01背包问题(C++)
  • Splunk PDF 格式要求
  • (Kotlin)Android 高效底部导航方案:基于预定义 Menu 和 ViewPager2 的 Fragment 动态绑定实现
  • 【微服务架构】SpringCloud Alibaba(三):负载均衡 LoadBalance
  • 算法练习(队列)
  • 框架修改思路
  • Elasticsearch安全与权限控制指南
  • 网站建设补充协议模板/今日新闻最新头条10条
  • 长沙本土网站制作公司/海底捞口碑营销案例
  • 无限动力网站/面点培训学校哪里有
  • 网站导航网站建设多少钱/网络推广app是违法的吗
  • 享学课堂 移动互联网开发/昆明seo关键词排名
  • 视频聊天室网站开发/阿里妈妈推广网站