Vue3集成搜索引擎智能提示API

news2024/11/16 2:23:35

需求:

如何在项目中实现像百度搜索框一样的智能提示效果,如下图所示:
在这里插入图片描述

相关知识:

下面是各厂商提供的免费API

厂商请求
百度http://suggestion.baidu.com/su?wd=中国&cb=window.baidu.sug
必应http://api.bing.com/qsonhs.aspx?type=cb&q=#content#&cb=window.bing.sug
谷歌http://suggestqueries.google.com/complete/search?client=youtube&q=#content#&jsonp=window.google.ac.h
好搜https://sug.so.360.cn/suggest?encodein=utf-8&encodeout=utf-8&format=json&word=#content#&callback=window.so.sug
淘宝https://suggest.taobao.com/sug?code=utf-8&q=#content#&callback=window.taobao.sug

以下是百度链接的结果,除了谷歌是下载一个txt文件外,其他厂商基本上都差不多,略有区别。

window.baidu.sug({q:“中国”,p:false,s:[“中国地图”,“中国移动”,“中国消防”,“中国教育考试网”,“中国知网”,“中国人事考试网”,“中国执行信息公开网个人查询”,“中国农业银行”,“中国银行”,“中国高等教育学生信息网(学信网)”]});

说明:window.baidu.sug是百度搜索的一个接口,用于获取搜索建议。通过发送请求,可以获取与输入关键词相关的搜索建议列表。其中,参数q表示搜索关键词,p表示搜索位置,bs表示输入框中的内容,csor表示是否开启拼音纠错,status表示请求状态,s表示搜索建议列表。

请求方式

  1. XMLHttpRequest(XHR)

    • 介绍:XMLHttpRequest是前端最早使用的数据请求方式,它支持异步请求,可以通过设置回调函数处理请求完成后的数据。
    • 特点:虽然在现代浏览器中表现良好,但随着浏览器性能的提升,其性能瓶颈逐渐凸显。此外,XMLHttpRequest的语法相对复杂,使用起来不够直观。
    • 使用场景:适用于一些老旧项目或者需要与多种后端系统交互的场景。
  2. Fetch API

    • 介绍:Fetch是一个现代的、基于Promise的HTTP客户端,用于浏览器和Node.js。它提供了一种更简洁、更易于理解的方式来处理网络请求。
    • 特点:Fetch API的语法简洁、易读,且返回Promises,使得异步操作更加易于管理和链式调用。此外,Fetch API还支持跨域请求和流式响应。
    • 使用场景:适用于现代浏览器中的网络请求处理。
  3. Axios

    • 介绍:Axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js。它扩展了Fetch API,提供了更丰富的功能。
    • 特点:Axios支持请求和响应拦截器、自动转换JSON数据、取消请求等功能。此外,它还提供了统一的错误处理机制。
    • 使用场景:适用于需要处理复杂网络请求的场景,如添加请求和响应拦截器、自动处理JSON数据等。
  4. 表单提交

    • 介绍:通过HTML表单提交数据到服务器。
    • 特点:表单提交是同步请求,会刷新页面。但可以通过设置表单的method属性为POST来避免在URL中暴露数据。
    • 使用场景:适用于简单的数据提交场景。
  5. JSONP

    • 介绍:一种通过<script>标签的src属性跨域请求数据的方式。
    • 特点:JSONP只能发送GET请求,且存在安全风险(如XSS攻击)。
    • 使用场景:适用于解决跨域问题,但现代浏览器更推荐使用CORS(跨源资源共享)来解决跨域问题。

实现:

第一步:Element 提供了 el-autocomplete 组件 el-autocomplete

第二步:发送请求,使用的是 axios ,通过 fetch 组件发送,发现请求成功了,但是无法接受返回的数据

问题:因为API返回的是JSONP数据,JSONP是跨域访问的一种方式,网上很多都是用的原生的 js 代码去发送请求,嵌入到vue中不太方便,因此我想着vue能不能直接发送jsonp 请求,后面发现vue-resource可以发送,但是Vue3项目当前无法继续使用vue-resource进行http请求。

什么是JSONP接口:浏览器端通过

  • JSONP 不属于真正的 Ajax 请求,因为它没有使用 XMLHttpRequest 这个对象
  • JSONP 仅支持 GET 请求,不支持POST、PUT、DELETE 等请求

如果项目中已经配置了 CORS跨域资源共享,为了防止冲突,必须在配置 CORS 中间件之前声明 JSONP 的接口。否则 JSONP 接口会被处理成开启了 CORS 的接口,对于 JSONP,你应该使用 XMLHttpRequest 或者动态创建一个

解决:暂时直接通过后端去调用,响应速度还可以,后面前端调用好了,再来更新此文。

// 核心代码如下,包括发送请求和解析百度接口的数据
String re = HttpRequest.get(url).execute().onSuccess(ResponseSpec::asString);

String regex = "s:\\[(\"(.*?)\"(?:,\\\"(.*?)\\\")*)\\]";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(re);

        if (matcher.find()) {
            // 提取匹配到的内容,但这里需要额外的处理,因为正则表达式无法直接处理嵌套的引号
            // 我们可以尝试通过分割逗号来获取每个元素,但需要注意处理可能的转义字符(在这个特定例子中,我们假设没有转义字符)
            String arrayString = matcher.group(1);
            // 移除首尾的多余字符(如果有的话)
            arrayString = arrayString.trim().replaceAll("^\"|\"$", ""); // 移除首尾的双引号(如果有的话)
            // 分割字符串获取每个元素
            String[] elements = arrayString.split("\",\""); // 分割逗号,但注意这里假设没有逗号在引号内

            // 将元素装入列表
            List<String> sList = new ArrayList<>();
            for (String element : elements) {
                // 可能需要额外的处理来移除任何额外的引号或空格
                sList.add(element.trim().replaceAll("^\"|\"$", "")); // 移除首尾的双引号(如果有的话)
            }

            // 将sList封装为List<Object>返回即可,Object中包含value属性
            ......
        } else {
            log.error("未找到匹配的 s 数组内容。");
        }

前端通过XMLHttpRequest,仅供参考

function querySearch(queryString, cb) {
  // 创建一个唯一的回调函数名,以避免命名冲突
  const callbackName = `baiduSugCallback_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;

  // 在全局作用域中定义回调函数
  window[callbackName] = function(data) {
    // 调用传入的回调函数,并传入解析后的数据
    cb(data);
    // 清理全局回调函数
    delete window[callbackName];
  };

  // 创建并配置一个 JSONP 请求
  const xhr = new XMLHttpRequest();
  const url = `https://suggestion.baidu.com/su?wd=${encodeURIComponent(queryString)}&cb=${callbackName}`;
  xhr.open('GET', url, true);
  xhr.send();

  // 处理请求失败的情况(可选)
  xhr.onerror = function() {
    // 可以在这里处理错误,例如调用 cb 函数并传入一个错误对象
    delete window[callbackName]; // 确保在出错时也清理回调函数
    cb(new Error('JSONP request failed'));
  };
}

// 使用 querySearch 函数
querySearch('美国', function(data) {
  console.log(data); // 输出解析后的数据
});

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

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

相关文章

大数据技术在智慧医疗中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 大数据技术在智慧医疗中的应用 大数据技术在智慧医疗中的应用 大数据技术在智慧医疗中的应用 引言 大数据技术概述 定义与原理 发…

游戏引擎学习第10天

视频参考:https://www.bilibili.com/video/BV1LyU3YpEam/ 介绍intel architecture reference manual 地址:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html RDTS&#xff08;读取时间戳计数器&#xff09;指令是 x86/x86_64 架构中的…

「QT」文件类 之 QTemporaryDir 临时目录类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

Kettle配置数据源错误“Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found”解决记录

问题描述 错误提示&#xff1a;“Driver class ‘org.gjt.mm.mysql.Driver’ could not be found, make sure the ‘MySQL’ driver (jar file) is installed.” 原因分析&#xff1a; 根据错误提示是缺少了相关的数据源连接jar包。 解决方案&#xff1a; 安装对应的Mysql…

C++《继承》

在之前学习学习C类和对象时我们就初步了解到了C当中有三大特性&#xff0c;分别是封装、继承、多态&#xff0c;通过之前的学习我们已经了解了C的封装特性&#xff0c;那么接下来我们将继续学习另外的两大特性&#xff0c;在此将分为两个章节来分别讲解继承和多态。本篇就先来学…

力扣(LeetCode)283. 移动零(Java)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:雾失楼台&#xff0c;月迷津渡&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主…

运算放大器的学习(一)输入阻抗

输入阻抗 最近需要对运算放大器进行学习&#xff0c;我们后面逐一对其参数进行了解。 首先了解下输入阻抗。 放大电路技术指标测试示意图&#xff1a; 输入电阻&#xff1a; 从放大电路的输入端看进去的等效电阻称为放大电路的输入电阻&#xff0c;如上图&#xff0c;此处考虑…

Python3.11.9下载和安装

一、Python3.11.9下载和安装 1、下载 下载地址&#xff1a;https://www.python.org/downloads/windows/ 选择版本下载&#xff0c;例如&#xff1a;Python 3.11.9 - April 2, 2024 2、安装 双击exe安装 3、配置环境变量 pathD:\Program Files\python3.11.9 pathD:\Progr…

大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载

随着生成算法、预训练模型、多模态数据分析等AI技术的聚集融合&#xff0c;AIGC技术的实践效用迎来了行业级大爆发。通用大模型技术的成熟推动了新一轮行业生产力变革&#xff0c;在投入提升与政策扶植的双重作用下&#xff0c;以大模型技术为底座、结合专业化金融能力的金融大…

杰控通过 OPCproxy 获取数据发送到服务器

把数据从 杰控 取出来发到服务器 前提你在杰控中已经有变量了&#xff08;wincc 也适用&#xff09; 打开你的opcproxy 软件包 opcvarFile 添加变量 写文件就写到 了 opcproxy.ini中 这个文件里就是会读取到的数据 然后 opcproxy.exe发送到桌面快捷方式再考回来 &#…

Vue3 -- 环境变量的配置【项目集成3】

环境&#xff1a; 在项目开发过程中&#xff0c;至少会经历开发环境、测试环境和生产环境(即正式环境)三个阶段。 开发环境 .env.development测试环境 .env.test生产环境 .env.production 不同阶段请求的状态(如接口地址等)不一样&#xff0c;开发项目的时候要经常配置代理跨…

vxe-table 分享实现无限滚动行方式

Vxe UI vue vxe-table 分享无限滚动行方式 实现无限滚动加载有多种方式&#xff0c;可以使用 scroll 事件&#xff0c;也可以使用 scroll-boundary 事件&#xff0c;能满足不同的需求场景。 以下是分享使用 scroll-boundary 事件的用法。 原理 通过 scrollY.threshold 设置阈…

C++中的栈(Stack)和堆(Heap)

在C中&#xff0c;堆&#xff08;heap&#xff09;和栈&#xff08;stack&#xff09;是两种用于存储数据的内存区域。理解它们的原理和区别&#xff0c;对于优化代码性能和确保代码的安全性至关重要。以下是对C中堆栈的详细解析&#xff0c;包括它们的分配方式、优缺点、应用场…

outlook邮箱关闭垃圾邮件——PowerAutomate自动化任务

微软邮箱反垃圾已经很强大了非常敏感&#xff0c;自家的域名的邮件都能给扔到垃圾邮箱里&#xff0c;但还是在本地增加了一层垃圾邮箱功能&#xff0c;然后垃圾邮箱并没有提示&#xff0c;导致错过很多通知&#xff0c;本身并没有提供关闭的功能&#xff0c;但微软有个Microsof…

FFmpeg的基本结构

FFmpeg框架可以简单分为两层&#xff0c;上层是以ffmpeg、ffplay、ffprobe为代表的命令行工具&#xff1b;其底层支撑是一些基础库&#xff0c;包含AVFormat、AVCodec、AVFilter、AVDevices、AVUtils等模块库。 常用函数如下&#xff1a; 1. AVFormat 封装/解封装模块 avf…

Web性能优化:从基础到高级

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Web性能优化&#xff1a;从基础到高级 Web性能优化&#xff1a;从基础到高级 Web性能优化&#xff1a;从基础到高级 引言 基础优…

MATLAB实战 利用1D-DCGAN生成光谱或信号数据

0.前言 在光谱学或信号处理领域&#xff0c;获取大量高质量的数据可能是一项挑战。利用DCGAN进行“迁移学习”&#xff0c;对抗性地生成光谱或信号数据&#xff0c;具有强化、泛化样本特征的应用潜力。 该实战项目提供了所有源代码与测试数据&#xff0c;旨在帮助学者快速地掌握…

react + ts定义接口类型写法

接口&#xff08;未进行ts定义&#xff09; export async function UserList(params: {// keyword?: string;current?: number;pageSize?: number;},// options?: { [key: string]: any }, ) {return request<API1.UserList>(http://geek.itheima.net/v1_0/mp/artic…

uniapp luch-request 使用教程+响应对象创建

1. 介绍 luch-request 是一个基于 Promise 开发的 uni-app 跨平台、项目级别的请求库。它具有更小的体积、易用的 API 和方便简单的自定义能力。luch-request 支持请求和响应拦截、全局挂载、多个全局配置实例、自定义验证器、文件上传/下载、任务操作、自定义参数以及多拦截器…

RHCE-DNS域名解析服务器

一、DNS简介 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 DNS 系统使用的是网络的查询&#xff0c;那么自然需要有监听的 port 。 DNS 使…