vue流式接口的使用解讀(EventSource)
一、EventSource
1.如果接口地址是http協(xié)議的,使用EventSource。如果是ws的,使用webSocket
2.主動關(guān)閉流式請求連接的方式:source.close()
3.參考鏈接:Websocket的用法及常見應(yīng)用場景
if (!!window.EventSource) {
// 建立連接
let source = new EventSource(window.config.baseURL + '/tsyp/stream?uuid=' + uuid);
//連接一旦建立,就會觸發(fā)open事件
source.onopen = function (event) {
}
//客戶端收到服務(wù)器發(fā)來的數(shù)據(jù)
source.onmessage = function (event) {
let data = event.data
if (data == "AIQA_EOF") {
source.close() //關(guān)閉請求的連接
}
}
//如果發(fā)生通信錯(cuò)誤(比如連接中斷),就會觸發(fā)error事件
source.onerror = function (event) {
console.error('EventSource failed:', event);
}
} else {
console.warn("你的瀏覽器不支持SSE");
}二、流式接口要求攜帶請求頭
1.可以使用封裝的EventSourcePolyfill。(此方法只能用get請求)
但注意:
EventSourcePolyfill發(fā)送的請求可以攜帶請求頭,但是只能是get請求
async putQuestion(query) {
let that = this
// 建立連接
let source = new EventSourcePolyfill(`/eventSourceFill/chat/conversation/stream`,
{
withCredentials: true,
headers: {
"Content-Type": "application/json",
Authorization: 'Bearer ' + getToken(),
connection: "keep-alive",
}
});
//連接一旦建立,就會觸發(fā)open事件
source.onopen = function (event) {
source.send('Authorization: Bearer ' + getToken());
console.log("連接建立成功")
}
//客戶端收到服務(wù)器發(fā)來的數(shù)據(jù)
source.onmessage = function (event) {
let data = event.data
console.log("data:", data)
if (data == "AIQA_EOF") {
source.close()
} else {
}
}
//如果發(fā)生通信錯(cuò)誤(比如連接中斷),就會觸發(fā)error事件
source.onerror = function (event) {
console.error('EventSource failed:', event);
}
},2.請求要求攜帶請求頭(post、get請求均可)
async sendRequest(query) {
let controller = new AbortController();
let {signal} = controller;
//controller.abort() 用于取消fetch接口請求
this.cancel_QA = controller
//使用fetch發(fā)送請求
const response = await fetch('http://****/chat/conversation/stream', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + getToken()
},
body: JSON.stringify(query),
signal
});
// 檢查響應(yīng)是否成功
if (!response.ok) {
console.error('網(wǎng)絡(luò)響應(yīng)失敗:', response.statusText);
return;
}
// 獲取響應(yīng)體的可讀流
const reader = response.body.getReader();
const decoder = new TextDecoder('utf-8');
// 逐塊讀取數(shù)據(jù)
while (true) {
const {done, value} = await reader.read();
if (done) break; // 流結(jié)束
let msg = decoder.decode(value, {stream: true})
if (msg.includes("LLM-EOF")) {
console.warn("回答結(jié)束")
this.cancel_QA = null
} else {
}
}
},總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
element自定義 多文件上傳 觸發(fā)多次on-change問題
這篇文章主要介紹了element自定義 多文件上傳 觸發(fā)多次on-change問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Vue之beforeEach非登錄不能訪問的實(shí)現(xiàn)(代碼親測)
這篇文章主要介紹了Vue之beforeEach非登錄不能訪問的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
vue項(xiàng)目base64加解密使用方式以及解密亂碼
這篇文章主要介紹了vue項(xiàng)目base64加解密使用方式以及解密亂碼問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
一次VUE項(xiàng)目中遇到XSS攻擊的實(shí)戰(zhàn)記錄
XSS?攻擊是頁面被注入了惡意的代碼,下面這篇文章主要給大家介紹了一次VUE項(xiàng)目中遇到XSS攻擊的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)
這篇文章主要介紹了vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
element?select必填項(xiàng)驗(yàn)證回顯問題的解決
本文主要介紹了element?select必填項(xiàng)驗(yàn)證回顯問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
使vue實(shí)現(xiàn)jQuery調(diào)用的兩種方法
這篇文章主要介紹了使vue實(shí)現(xiàn)jQuery調(diào)用的兩種方法 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
Vue3動態(tài)倒計(jì)時(shí)的代碼實(shí)現(xiàn)
在使用Vue框架開發(fā)Web應(yīng)用時(shí),倒計(jì)時(shí)功能是一個(gè)常見的需求,它可以在一定時(shí)間內(nèi)重復(fù)執(zhí)行某些操作,比如防止用戶重復(fù)提交表單、限制投票次數(shù)、實(shí)現(xiàn)驗(yàn)證碼獲取等功能,所以本文給大家介紹了Vue3動態(tài)倒計(jì)時(shí)的代碼實(shí)現(xiàn),需要的朋友可以參考下2024-09-09

