larksuite / oapi-sdk-java

Apache License 2.0
229 stars 87 forks source link

支持jakarta.servlet #83

Open weijie0 opened 1 year ago

weijie0 commented 1 year ago

springboot 升级到3,默认使用jakarta.servlet sdk不支持

wintbiit commented 1 year ago

当前阶段可用手动复刻ServletAdapter和HttpTranslator来解决,希望得到sdk支持

xlioo commented 9 months ago

支持该请求。当前阶段可用手动复刻ServletAdapter和HttpTranslator来解决,希望得到sdk支持

有具体例子吗

wintbiit commented 9 months ago

支持该请求。当前阶段可用手动复刻ServletAdapter和HttpTranslator来解决,希望得到sdk支持

有具体例子吗

@xlioo 重新实现 com.lark.oapi.sdk.servlet.ext.ServletAdaptorcom.lark.oapi.sdk.servlet.ext.HttpTranslator,我的是kotlin的参考一下~

ServletAdaptor.kt

import com.lark.oapi.card.CardActionHandler
import com.lark.oapi.event.EventDispatcher
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse

/**
 * Servlet的适配器,用于适配基于Jakarta Servlet技术栈实现的Web服务
 */
class ServletAdapter {
    /**
     * 处理消息事件
     *
     * @param req
     * @param response
     * @param eventDispatcher
     */
    fun handleEvent(req: HttpServletRequest, response: HttpServletResponse, eventDispatcher: EventDispatcher) {
        // 转换请求对象
        val eventReq = HttpTranslator.translate(req)

        // 处理请求
        val resp = eventDispatcher.handle(eventReq)

        // 回写结果
        HttpTranslator.write(response, resp)
    }

    /**
     * 处理卡片消息
     *
     * @param req
     * @param response
     * @param handler
     */
    fun handleCardAction(req: HttpServletRequest, response: HttpServletResponse, handler: CardActionHandler) {
        // 转换请求对象
        val eventReq = HttpTranslator.translate(req)

        // 处理请求
        val resp = handler.handle(eventReq)

        // 回写结果
        HttpTranslator.write(response, resp)
    }
}

HttpTranslator.kt

import com.lark.oapi.core.request.EventReq
import com.lark.oapi.core.response.EventResp
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import java.io.IOException
import java.nio.charset.StandardCharsets
import java.util.*
import java.util.stream.Collectors

object HttpTranslator {
    @Throws(IOException::class)
    fun translate(request: HttpServletRequest): EventReq {
        val req = EventReq().apply {
            headers = request.headerMap()
            body = request.rawBody()
            httpPath = request.requestURI
        }
        return req
    }

    @Throws(IOException::class)
    fun write(response: HttpServletResponse, eventResp: EventResp) {
        response.status = eventResp.statusCode
        eventResp.headers.forEach { (name, values) ->
            values.forEach { value ->
                response.addHeader(name, value)
            }
        }
        response.writer.write(String(eventResp.body ?: return))
    }

    private fun HttpServletRequest.headerMap() =
        headerNames.toList().associateWith { name ->
            getHeaders(name).toList()
        }

    private fun HttpServletRequest.rawBody() =
        reader.lines().collect(Collectors.joining(System.lineSeparator())).toByteArray(StandardCharsets.UTF_8)
}