vue流式接口的使用解讀(EventSource)
一、EventSource
1.如果接口地址是http協(xié)議的,使用EventSource。如果是ws的,使用webSocket
2.主動關(guān)閉流式請求連接的方式:source.close()
3.參考鏈接:Websocket的用法及常見應用場景
if (!!window.EventSource) {
// 建立連接
let source = new EventSource(window.config.baseURL + '/tsyp/stream?uuid=' + uuid);
//連接一旦建立,就會觸發(fā)open事件
source.onopen = function (event) {
}
//客戶端收到服務器發(fā)來的數(shù)據(jù)
source.onmessage = function (event) {
let data = event.data
if (data == "AIQA_EOF") {
source.close() //關(guān)閉請求的連接
}
}
//如果發(fā)生通信錯誤(比如連接中斷),就會觸發(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("連接建立成功")
}
//客戶端收到服務器發(fā)來的數(shù)據(jù)
source.onmessage = function (event) {
let data = event.data
console.log("data:", data)
if (data == "AIQA_EOF") {
source.close()
} else {
}
}
//如果發(fā)生通信錯誤(比如連接中斷),就會觸發(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
});
// 檢查響應是否成功
if (!response.ok) {
console.error('網(wǎng)絡(luò)響應失敗:', response.statusText);
return;
}
// 獲取響應體的可讀流
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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
element自定義 多文件上傳 觸發(fā)多次on-change問題
這篇文章主要介紹了element自定義 多文件上傳 觸發(fā)多次on-change問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Vue之beforeEach非登錄不能訪問的實現(xiàn)(代碼親測)
這篇文章主要介紹了Vue之beforeEach非登錄不能訪問的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07
使vue實現(xiàn)jQuery調(diào)用的兩種方法
這篇文章主要介紹了使vue實現(xiàn)jQuery調(diào)用的兩種方法 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05

