当前位置:   article > 正文

Taro/react/微信小程序 对接chatgpt(SSE) 无需websocket_微信小程序sse

微信小程序sse

        需求:项目开发需求对接chatgpt生成一段文案,需要实时且有打字效果

        难点:无WebSocket实时,且为「text/event-stream;」小程序不支持这个东东,会一次性返回所有数据,这个时候就无法实时,所以想到了sse分段传输数据(我也不知道这么说对不对,大概意思就是流式返回数据)

        知识点:微信小程序提供了「requestTask这个东东

接下来就一起看看如何使用以「Taro」为例子满足需求,uniApp和wx原生应该差不多

  1. 第一步,直接正常调用接口
    1. const requestTask = Taro.request({
    2. url: textChat, // 你正常请求接口的地址
    3. timeout: 100000,
    4. method: "POST",
    5. header: {
    6. 'content-type': 'application/x-www-form-urlencoded'
    7. },
    8. enableChunked: true, // 必须的
    9. data: obj, // 接口的其他参数
    10. success: (response) => {
    11. requestTask.abort()
    12. // 这里是成功调用完的 可以写去掉加载中等逻辑
    13. // 由于SSE特性,需要由用户端断开连接,所以在使用完毕时,需要调用requestTask.abort()断开连接
    14. },
    15. fail: (error) => {
    16. Taro.showToast({
    17. title: error.errMsg == 'request:fail timeout' ? '请求超时,请稍后重试' : '网络错误,请稍后重试',
    18. icon: 'none',
    19. duration: 1000
    20. });
    21. },
    22. });

 2.第二步,对返回的数据进行操作,这个逻辑仅供参考,有不同的需要自行修改

  1. requestTask.onHeadersReceived(function (res) {
  2. console.log(res.header);
  3. });
  4. requestTask.onChunkReceived((response: any) => {
  5. // 对返回的数据进行操作,这个逻辑仅供参考,有不同的需要自行修改
  6. let arrayBuffer = response.data; // 接收持续返回的数据
  7. let uint8Array = new Uint8Array(arrayBuffer);
  8. let text = Taro.arrayBufferToBase64(uint8Array);
  9. const base64ToUtf8 = (base64String) => {
  10. // base64转utf8 这个方法可以提出去 我这里方便展示
  11. // new TextDecoder() 小程序真机中没有这个方法,得下载一个这个 text-encoding
  12. // npm install text-encoding --save-dev
  13. // 引入import { TextDecoder } from "text-encoding/lib/encoding";
  14. const bytes = Taro.base64ToArrayBuffer(base64String);
  15. const utf8String = new TextDecoder().decode(bytes);
  16. return utf8String;
  17. }
  18. text = base64ToUtf8(text);
  19. // console.log(text);
  20. // 持续的转译 最后会变成类似这样的
  21. // {xx: 111}\n{xx: 111}\n{xx: 111}
  22. const convertStringToArr = (str) => {
  23. // 格式化返回的流式数据 这个方法也可以提出去 我这里方便展示
  24. var arr = str.trim().split('\n').map(JSON.parse);
  25. return arr;
  26. }
  27. let textArr = convertStringToArr(text);
  28. // console.log(textArr);
  29. // textArr会变成数组对象[{xx: 111},{xx: 11},{xx: 111}]
  30. textArr.map((v: any) => {
  31. if (v.hasOwnProperty('xx')) {
  32. // 这里的xx为流式传输的关键词 如果有多个关键词 需要写多个if判断
  33. str += v.xx;
  34. // console.log(str);
  35. // 这里只有把str作为值持续给到页面上即可实现打字效果
  36. }
  37. if (v.hasOwnProperty('code')) {
  38. // 这里的code为后端返回的 成功或者失败都在这里体现所以要单独做一个判断
  39. // console.log(v);
  40. if (v.code != 200) {
  41. Taro.showToast({
  42. title: v.msg,
  43. icon: 'none',
  44. duration: 1000
  45. })
  46. }
  47. }
  48. })
  49. });

3.参考资料

在微信小程序中用流模式打造ChatGPT实时回复机器人

淡莣一苆~微信小程序对接SSE接口记录

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/664677
推荐阅读
相关标签
  

闽ICP备14008679号