Android okHttp-sse 实现chatgpt逐字逐句效果
1. 什么是SSE
Server-Send Events 服务器发送事件,简称SSE。服务器主动向客户端推送消息,我们常见的有 WebSocket (SignalR) ,SSE 也是其中一种。
SSE 是HTML5规范的一部分,该规范非常简单,主要由两部分组成:第一部分是服务端与浏览器端的通讯协议(Http协议),第二部分是浏览器端可供JavaScript使用的EventSource对象。
严格意义上来说,Http协议是无法做到服务器主动向浏览器发送协议,但是可以变通下,服务器向客户端发起一个声明,我下面发送的内容将是 text/event-stream
格式的,这个时候浏览器就知道了。响应文本内容是一个持续的数据流,每个数据流由不同的事件组成,并且每个事件可以有一个可选的标识符,不同事件内容之间只能通过回车符r
和换行符n
来分隔,每个事件可以由多行组成。目前除了IE和Edge,其他浏览器均支持(注:摘自https://www.cnblogs.com/jesn/p/16267606.html)
2. 使用方法
implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.squareup.okhttp3:okhttp-sse:4.11.0'
val createFactory = EventSources.createFactory(okHttpClient)
val eventSourceListener = object : EventSourceListener() {
override fun onEvent(
eventSource: EventSource,
id: String?,
type: String?,
data: String
) {
//事件接收
Logger.d(data)
}
override fun onFailure(eventSource: EventSource, t: Throwable?, response: Response?) {
super.onFailure(eventSource, t, response)
}
}
createFactory.newEventSource(request, eventSourceListener)
请求头需要添加
addHeader("Accept", "text/event-stream")
创建okHttpClient
val builder = OkHttpClient.Builder()
builder.retryOnConnectionFailure(true)
builder.connectTimeout(5, TimeUnit.MINUTES)
builder.readTimeout(5, TimeUnit.MINUTES)
okHttpClient = builder.build()