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()