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

需求:

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

相关知识:

下面是各厂商提供的免费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.mzph.cn/bicheng/60718.shtml

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

相关文章

一文了解Android的核心系统服务

在 Android 系统中&#xff0c;核心系统服务&#xff08;Core System Services&#xff09;是应用和系统功能正常运行的基石。它们负责提供系统级的资源和操作支持&#xff0c;包含了从启动设备、管理进程到提供应用基础组件的方方面面。以下是 Android 中一些重要的核心系统服…

鸿蒙实战:页面跳转

文章目录 1. 实战概述2. 实现步骤2.1 创建项目2.2 准备图片素材2.3 编写首页代码2.4 创建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 实战概述&#xff1a;本实战通过ArkUI框架&#xff0c;在鸿蒙系统上开发了一个简单的两页面应用。首页显示问候语和“下一页”按钮&…

2023_Spark_实验十五:SparkSQL进阶操作

实验目标 通过实践掌握Spark SQL中复杂查询&#xff08;包括子查询、窗口函数、联接等&#xff09;的实现方式。了解如何通过合理的数据分区和缓存策略进行性能优化。实现一个基于Spark SQL的ETL数据处理流程&#xff0c;应用相关优化技巧。 实验背景 在本实验中&#xff0c…

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

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

MySQL联合索引(abc)命中测试

1.建表 mysql创建一张表&#xff0c;表名&#xff1a;‘test_models’ id列为 主键&#xff0c;int类型 &#xff0c;自增a,b,c,d,e 全部是int&#xff08;11&#xff09;为&#xff08;a,b,c&#xff09;添加一个联合索引 index_abc 执行语句&#xff1a;创建表 CREATE TA…

Gin 框架入门(GO)-1

1 介绍 Gin 是一个 Go (Golang) 编写的轻量级 http web 框架&#xff0c;运行速度非常快&#xff0c;Gin 最擅长的就是 Api 接口的高并发。 2 Gin 环境搭建 1.下载并安装 gin go get -u github.com/gin-gonic/gin 2.将 gin 引入到代码中&#xff1a; import "github.co…

VUE3+Three.js搭建教程

一、创建VUE项目工程 1、方法一 使用下面命令行快速创建vue项目&#xff0c;Please pick a preset这里我们选择使用VUE3 vue create projectName 创建时可能会遇到的报错 错误原因&#xff1a;当前使用的node版本未全局安装vue-cli脚手架&#xff0c;使用下面命令安装后再使…

【React】状态管理之Redux

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 状态管理之Redux引言1. Redux 的核心概念1.1 单一数据源&#xff08;Single Sou…

自己动手写Qt Creator插件

文章目录 前言一、环境准备1.先看自己的Qt Creator IDE的版本2.下载源码 二、使用步骤1.参考原本的插件2.编写自定义插件1.cmakelist增加一个模块2.同理&#xff0c;qbs文件也增加一个3.插件源码 三、效果总结 前言 就目前而言&#xff0c;Qt Creator这个IDE&#xff0c;插件比…

React Native 全栈开发实战班 -React Native 基础

本课程旨在帮助学员系统掌握 React Native 全栈开发技能&#xff0c;从基础入门到实战项目开发。课程将分为多个模块&#xff0c;第一部分将聚焦于 React Native 的基础知识&#xff0c;包括开发环境搭建、React Native 简介与特点&#xff0c;以及项目结构解析。 第一部分&am…

Leetcode:118. 杨辉三角——Java数学法求解

题目——Leetcode:118. 杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRow…

Linux中.NET读取excel组件,不会出现The type initializer for ‘Gdip‘ threw an exception异常

组件&#xff0c;可通过nuget安装&#xff0c;直接搜名字&#xff1a; ExcelDataReader using ConsoleAppReadFileData.Model; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…

Robot | 用 RDK 做一个小型机器人(更新中)

目录 前言架构图开发过程摄像头模型转换准备校准数据使用 hb_mapper makertbin 工具转换模型 底版开发 结语 前言 最近想开发一个小型机器人&#xff0c;碰巧看到了 RDK x5 发布了&#xff0c;参数对于我来说非常合适&#xff0c;就买了一块回来玩。 外设也是非常丰富&#xf…

jenkins使用cli发行uni-app到h5

官网文档HBuilderX 文档 首先确定是否存在环境变量 正常情况cmd中执行cli 如果提示 cli 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。请先配置环境变量 Freestyle Project项目在Build Steps中增加Execute Windows batch command命令如下 d: cd D:\devsof…

基于Zynq FPGA对雷龙SD NAND的测试

一、SD NAND特征 1.1 SD卡简介 雷龙的SD NAND有很多型号&#xff0c;在测试中使用的是CSNP4GCR01-AMW与CSNP32GCR01-AOW。芯片是基于NAND FLASH和 SD控制器实现的SD卡。具有强大的坏块管理和纠错功能&#xff0c;并且在意外掉电的情况下同样能保证数据的安全。 其特点如下&…

【Java语言】String类

在C语言中字符串用字符可以表示&#xff0c;可在Java中有单独的类来表示字符串&#xff08;就是String&#xff09;&#xff0c;现在我来介绍介绍String类。 字符串构造 一般字符串都是直接赋值构造的&#xff0c;像这样&#xff1a; 还可以这样构造&#xff1a; 图更能直观的…

【神经科学学习笔记】基于分层嵌套谱分割(Nested Spectral Partition)模型分析大脑网络整合与分离的局部指标(二)

前言 1.学习背景 前几天笔者学习使用NSP (Network Segregation and Partnership) 算法计算大脑整合分离的全局指标&#xff0c;现在要在之前学习的基础上再来玩玩局部指标。 局部指标的计算主要在两个层面上进行&#xff1a;第一个层面是针对每个独立ROI的指标计算&#xff0…

WPF-控件的属性值的类型转化

控件的属性值需要转成int、double进行运算的&#xff0c;可以使用一下方法 页面代码 <StackPanel Margin"4,0,0,0" Style"{StaticResource Form-StackPanel}"> <Label Content"替换后材料增加金额&#xff…

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…

大模型学习笔记------BLIP模型的再思考

大模型学习笔记------BLIP模型的再思考 1、BLIP推理---如何进行“图生文”2、BLIP推理---如何进行视觉问答&#xff08;Visual Question Answering, VQA&#xff09;3、BLIP推理---如何进行图文检索&#xff08;Image-text retrieval&#xff09;任务4、总结 上一篇文章上文中讲…