当前位置: 首页 > news >正文

不写前端代码,curl直接调试sse

不写前端代码,curl直接开两个终端调试sse

过程:

客户端向服务端发送建立连接请求;
服务端向客户端推送内容;
服务端向客户端发送结束信号并结束

注意事项:

只有连接时要求content-type是xxx

其他问题:

服务端打算断开时,是否需要先得到客户端应答再断开?

java代码参考:

controller层


@RestController
public class ChatController {@Autowiredprivate ChatService chatService;// TODO: 2023/10/16 执行顺序@CrossOrigin@PostMapping(value = "/ask")@SneakyThrowspublic void chatGPT(@RequestBody ChatRequest request) {chatService.chat(request);// TODO: 2023/10/16 执行顺序 2}@CrossOrigin@GetMapping(value = "/link", produces = "text/event-stream;charset=utf-8")@SneakyThrowspublic SseEmitter link() {return chatService.link();// TODO: 2023/10/16 执行顺序 1}@CrossOrigin@PostMapping(value = "/stop")@SneakyThrowspublic void chatGPT() {chatService.stop();// TODO: 2023/10/16 执行顺序 3}
}
请求体

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatRequest {private String question;
}
接口

public interface ChatService {void chat(ChatRequest request);SseEmitter link();void stop();}
实现类
@Slf4j
@Service
public class ChatServiceImpl implements ChatService {static HashMap<String, SseEmitter> map = new HashMap<>();@SneakyThrows@Overridepublic void chat(ChatRequest request) {SseEmitter sseEmitter = map.get("222");String question = request.getQuestion();char[] chars = question.toCharArray();for (int i = 0; i < chars.length; i++) {sseEmitter.send(SseEmitter.event().id("111").data(chars[i]));}}@SneakyThrows@Overridepublic SseEmitter link() {SseEmitter sseEmitter = new SseEmitter(0L);//设置超时时间,单位为毫秒map.put("222", sseEmitter);//  >> 回调1:长链接完成后回调接口(即关闭连接时调用)sseEmitter.onCompletion(() -> {map.remove("222");log.info("连接关闭, userId = {},  sessionId = {}, 时间戳 = {}", null, null, System.currentTimeMillis());// TODO: 2023/10/16 执行顺序 4});//  >> 回调2:出现异常会调用此方法sseEmitter.onError(new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) {log.info("连接出错, userId = {},  sessionId = {}, 时间戳 = {}", null, null, System.currentTimeMillis());sseEmitter.completeWithError(new RuntimeException("SSE 超时了"));}});//  >> 回调3:出现连接超时,会调用此方法sseEmitter.onTimeout(() -> {log.info("连接超时, userId = {},  sessionId = {}, 时间戳 = {}", null, null , System.currentTimeMillis());sseEmitter.completeWithError(new RuntimeException("SSE 超时了"));});sseEmitter.send(SseEmitter.event().data("操作成功"));return sseEmitter;}@SneakyThrows@Overridepublic void stop() {SseEmitter sseEmitter = map.get("222");sseEmitter.send(SseEmitter.event().id("111").data("中断"));sseEmitter.complete();}
}

终端开两个窗口通过curl验证效果

  • 请求连接的curl
curl -H "Accept: text/event-stream" http://localhost:9033/link

得到应答:
在这里插入图片描述

  • 提问的curl(这个演示的是将输入的文字推送出来):
curl -X POST -H "Content-Type: application/json" -d "{\"question\": \"hhhhh\"}" http://localhost:9033/ask

提问后得到的响应:
在这里插入图片描述

  • mock服务主动断开的curl:
curl -X POST http://localhost:9033/stop

客户端收到的:
在这里插入图片描述

http://www.lryc.cn/news/197257.html

相关文章:

  • 百分点科技受邀参加“一带一路”国际合作高峰论坛
  • git学习——第4节 时光机穿梭
  • golang 在 Mac、Linux、Window 下交叉编译
  • 半导体可靠性测试方法都有哪些?
  • 百度智能云发布AI原生应用工作台,为大模型落地五类需求提供最优
  • flutter 手机卡住,需要等待,主线程被占用
  • 微信小程序 onLoad(option) 方法
  • Vue3 实现文件预览 Word Excel pdf 图片 视频等格式 大全!!!!
  • GaussDB for openGauss部署形态
  • 6.MidBook项目经验之前端nuxt优化SEO和手机登录,微信登录
  • NR SRS power control
  • C++(boost):通过boost::process::child同步调用其他程序
  • 【经验分享】解决vscode编码问题
  • 核酸管外观缺陷检测(一)
  • NodeJS @kubernetes/client-node连接到kubernetes集群的方法
  • 【基于Kmeans、Kmeans++和二分K均值算法的图像分割】数据挖掘实验三
  • 深入理解Java CompletableFuture并发编程模型
  • TensorFlow手动加载数据集(以mnist为例)
  • C++项目实战——基于多设计模式下的同步异步日志系统(总集篇)
  • 杨辉三角按列求和
  • C复习-语句
  • [Python进阶] 操纵键盘:PyAutoGUI
  • jdbc快速开始
  • C语言中static关键字用法
  • STM32-LCD液晶显示
  • GraphQL 查询:一个全面指南
  • 快速自动化处理JavaScript渲染页面的方法
  • [计算机提升] 系统及用户操作
  • Linux篇 四、Linux修改用户名
  • 【Element-plus】如何让滚动条永远在最底部(支持在线演示)