微信小程序对接SSE接口记录

这篇具有很好参考价值的文章主要介绍了微信小程序对接SSE接口记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信小程序对接SSE接口记录

  • 需求:公司项目对接gpt,gpt产生的结果是分段返回,所以要求在产生结果时,有打字机的效果。原本是由定时器调用,后来优化改为服务端使用SSE接口。
  • 小程序使用起来比较方便,但是要求小程序基本库的版本需要在2.20.2以上。文档地址移步这里
  • 微信小程序代码
   // 基础库为2.33.0
   const requestTask = wx.request({
   	url: `xxxxxxxx`, // 需要请求的接口地址
   	enableChunked: true // enableChunked必须为true
   })
   // 开发工具存在问题,使用真机测试
   const listener = data => {
   		// data为返回的数据,可以在此对数据进行处理
   }
   // 监听服务端返回的数据
   requestTask.onChunkReceived(listener)
   // 移除监听 需传入与监听时同一个的函数对象
   requestTask.offChunkReceived(listener)

注意:文章来源地址https://www.toymoban.com/news/detail-606980.html

  1. 接收到的结果数据类型固定为arrayBuffer,需要开发者自己进行转换,可以使用下面方法进行转换。
function arrayBufferToString(arr){
   if(typeof arr === 'string') {  
   	return arr;  
   }  
   var dataview = new DataView(arr);
   var ints = new Uint8Array(arr.byteLength);
   for(var i=0;i<ints.length;i++){
     ints[i]=dataview.getUint8(i);
   }
   var str = '',  
   	_arr = ints;  
   for(var i = 0; i < _arr.length; i++) {
   	if (_arr[i]) {
   		var one = _arr[i].toString(2),  
   			v = one.match(/^1+?(?=0)/);  
   		if(v && one.length == 8) {
   			var bytesLength = v[0].length;
   			var store = _arr[i].toString(2).slice(7 - bytesLength);  
   			for(var st = 1; st < bytesLength; st++) {  
   				if ( _arr[st + i]) {
   					store += _arr[st + i].toString(2).slice(2);  
   				}
   			}  
   			str += String.fromCharCode(parseInt(store, 2));  
   			i += bytesLength - 1;  
   		} else {  
   			str += String.fromCharCode(_arr[i]);  
   		}  
   	}
   }  
   return str; 
}
  1. 微信开发工具中无法转换数据。可能是由于开发工具问题,在服务端返回的字符串中存在中文时,开发工具是无法正常转换的。但是在真机是正常的。如果需要在开发工具中实现转换,可以与服务端协商将数据进行URL编码返回。
  2. 服务端一次返回的结果,微信小程序有时会将其截开,并分两次返回。由于截开的位置并不固定,所以可能会存在转换ArrayBuffer时,出现结果异常的问题。使用SSE接口一般有两种需求:一种是将所有的结果累加起来、还有一种就是后面的结果覆盖前面的。在使用第一种时,每次的返回量不会太大,所以应该不会出现微信小程序截开两次返回的情况。但是第二种每次返回的接口都在逐渐增大,可能会出现这种情况,我就是第二种。我是使用下面方法解决
// 我的数据是json字符串,如果出现分开返回,在转json时,会出现报错,所以使用try处理
let timer = null
const arr = []
const listener = data => {
	try {
		// 上次结果出现报错 这次正常 清除延时器
		if (timer) {
			clearTimeout(timer)
			timer = null
		}
		// 小程序存在数据截开的情况  存五次数据
		if (arr.length > 4) {
			arr.shift()
		}
		// 这里要存储的是arrayBuffer,不能存储string数据
		arr.push(data.data)
		// 数据处理 .......
	} catch (e) {
		// 最后一次出现报错 三秒后重组数据
		timer = setTimeout(() => {
			const len = arr.length
			let index = len - 2,
				data = arr[len - 1],
				result = null
			while(index > -1) {
				// 从后往前 合并
				data = mergeArrayBuffers(arr[index], data)
				try{
					// 数据处理 .......
					index = -1
				}catch(e){
					index -= 1
				}
			}
		}, 3000)
	}
  }
// 合并arrayBuffer
function mergeArrayBuffers(buffer1, buffer2) {
	if (!buffer1) {
		return buffer2;
	} else if (!buffer2) {
		return buffer1;
	}
	var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
	tmp.set(new Uint8Array(buffer1), 0);
	tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
	return tmp.buffer;
}
  • 由于是后面的结果覆盖前面的,我只需要处理最后一次结果,如果结果正常则不用处理。不正常再将前面存储的数据一一合并,再做处理。
  • 通常一个中文是两个字节,所以可能会出现一个中文恰好被截开的情况,所以需要存储的是原数据
  1. 由于SSE特性,需要由用户端断开连接,所以在使用完毕时,需要调用requestTask.abort()断开连接
    ps: 此文章做个人平常记录

到了这里,关于微信小程序对接SSE接口记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序自研业务接口的服务器一点配置记录整理

    微信小程序的开发和APP的开发有些类似,但又略有不同。 App一般有很多版本,甚至要兼容很多版本兼容,尤其是各个小版本之间一般都是要共存的。当然如果有较大变化或者升级,尤其是底层逻辑或者数据库结构改动,一般会强制升级。 因为要多个版本兼容,互相不影响使

    2023年04月25日
    浏览(30)
  • 微信小程序-接入sse数据流并实现打字机效果( ChatGPT )

    从流中获取的数据格式如下 小程序调用SSE接口 我这边接收到的数据类型为Uint8Array,需要处理成text文本(如上图) 使对话有打字机效果 参考自:小程序实现 ChatGPT 聊天打字兼自动滚动效果 完整代码

    2024年04月09日
    浏览(62)
  • 微信小程序对接百度地图

    微信小程序如何接入百度地图导航功能?下面带来接入百度地图的操作教程。 1、登录百度地图开放平台:lbsyun.baidu.com,注册为开发者;需要填写使用场景,至少100字。 2、依次点击顶部开发文档—Web开发下方的微信小程序 Javascript API—开发指南—配置环境—下载百度地图微

    2024年02月10日
    浏览(29)
  • 微信小程序支付-java对接微信

     一共是两个方法: 一个方法后台生成预支付订单,得到预支付交易会话标识prepay_id,传给前端,让前端调起小程序支付; 一个是支付回调 目录 一、生成预支付订单  注意: 二、 支付回调         封装参数向微信发送生成预支付交易单请求,微信会返回一个prepay_id,再将

    2024年02月12日
    浏览(38)
  • 微信小程序对接微信支付详细教程

    小程序 微信支付官方文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_11index=2 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_0.shtml 前提 在进行对接微信支付之前,我们首先需要将以下几点准备好: 申请APPID 申请商户号 小程序开通微信支付,绑定已经申请好的商户号。

    2024年02月09日
    浏览(34)
  • 微信小程序对接萤石云开发平台

    最近收到了一个需求,需要在微信小程序对接萤石云平台,获取到摄像头画面,想到的第一种方法就是得到视频的url地址,直接放到 video 标签下就行了 1、初次尝试 登录萤石云平台,在我的,应用信息中查看AppKey和Secret(用于获取token) 获取token的接口文档地址为:https://o

    2024年04月28日
    浏览(21)
  • 微信小程序对接微信支付所遇问题合集

    1. 后端使用微信官方sdk会简单很多,可以看看在第五个大标题上。 2. 相关文档汇总:         1、WxJava - MiniApp Java SDK 4.6.0 API         2、wechatpay-java/README.md at main · wechatpay-apiv3/wechatpay-java · GitHub         3、网络 | 微信开放文档         4、开发指引 - JSAPI支付 | 微信支付商

    2024年04月25日
    浏览(42)
  • java对接微信小程序(登录&获取用户信息)

    用户通过小程序登录,进入到平台系统,进行各功能操作; 解决方案: 首先通过对接小程序,用户通过小程序登录及授权获取用户信息,后端调用接口获取微信用户信息,进行保存到数据库,然后返回token给前端(实际在这里相当于用户的一个注册及登录),前端使用该to

    2024年02月15日
    浏览(35)
  • uniapp微信小程序蓝牙连接与设备数据对接

    蓝牙连接并通信方法封装大致步骤。 初始化蓝牙并搜索; 获取并启用service服务; 数据读取和监听设备返回数据 需要使用uniapp官方提供api: 1、开启蓝牙适配器初始化蓝牙模块,获取手机蓝牙是否打开 2、开启蓝牙设备搜索 3、获取搜索到的设备信息 4、关闭蓝牙搜索 5、连接

    2024年02月04日
    浏览(39)
  • 对接微信小程序后台录入发货信息API

    /**      * 录入小程序发货信息      */     public function uploadWxappShippingInfo($openid,$order_data){         $data = array(             \\\'order_key\\\'=array(                 \\\'order_number_type\\\'=2,                 \\\'transaction_id\\\'=$order_data[\\\'transaction_id\\\'],//微信支付返回id             ),        

    2024年02月03日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包