Open weijie0 opened 1 year ago
当前阶段可用手动复刻ServletAdapter和HttpTranslator来解决,希望得到sdk支持
支持该请求。当前阶段可用手动复刻ServletAdapter和HttpTranslator来解决,希望得到sdk支持
有具体例子吗
支持该请求。当前阶段可用手动复刻ServletAdapter和HttpTranslator来解决,希望得到sdk支持
有具体例子吗
@xlioo 重新实现 com.lark.oapi.sdk.servlet.ext.ServletAdaptor
和 com.lark.oapi.sdk.servlet.ext.HttpTranslator
,我的是kotlin的参考一下~
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)
}
}
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)
}
springboot 升级到3,默认使用jakarta.servlet sdk不支持