当API像SSE(服务器发送事件)一样流时,如何在Axios中获得响应

2skhul33  于 2023-10-18  发布在  iOS
关注(0)|答案(1)|浏览(410)

工作环境:网络浏览器,JavaScript。
我想使用post方法调用sse API(服务器发送事件),如
https://platform.openai.com/docs/api-reference/completions/create

  1. curl https://api.openai.com/v1/completions \
  2. -H "Content-Type: application/json" \
  3. -H "Authorization: Bearer $OPENAI_API_KEY" \
  4. -d '{
  5. "model": "gpt-3.5-turbo",
  6. "prompt": "Say this is a test",
  7. "max_tokens": 7,
  8. "steam": true,
  9. "temperature": 0
  10. }'

我在网上做了一些研究,发现我不能使用EventSource,因为它不支持发送帖子数据。
所以我写了这样的代码在浏览器中尝试阅读蒸汽中的文本。
我不知道这样好不好

  1. const response = await axios({
  2. method: 'post',
  3. url: '/my-service/chat',
  4. data: data,
  5. headers: {
  6. 'SESSION_ID': 'Header-Value',
  7. "Content-Type": "application/json",
  8. "Accept": "text/event-stream",
  9. }
  10. , responseType: 'steam',
  11. });
  12. //TODO: read steam and convert to text

我很感激你能提供的任何帮助。在此先谢谢您!

k5ifujac

k5ifujac1#

我的解决方案选择了fetch-event-source框架。
https://github.com/Azure/fetch-event-source
以下是一些其他的选择:
JavaScript+axios:

  1. axios({
  2. url: 'https://api',
  3. data: {
  4. prompt: 'json data'
  5. },
  6. headers: {
  7. 'accept': '*',
  8. 'content-type': 'application/json'
  9. },
  10. method: 'POST',
  11. onDownloadProgress: progressEvent => {
  12. const xhr = progressEvent.event.target
  13. const { responseText } = xhr
  14. console.log("=====responseText======")
  15. console.log(responseText)
  16. }
  17. }).then(({ data }) => Promise.resolve(data));

服务器+Java代码:
spring-server-sent-events:https://www.baeldung.com/spring-server-sent-events

  1. public void consumeServerSentEvent() {
  2. WebClient client = WebClient.create("http://localhost:8080/sse-server");
  3. ParameterizedTypeReference<ServerSentEvent<String>> type
  4. = new ParameterizedTypeReference<ServerSentEvent<String>>() {};
  5. Flux<ServerSentEvent<String>> eventStream = client.get()
  6. .uri("/stream-sse")
  7. .retrieve()
  8. .bodyToFlux(type);
  9. eventStream.subscribe(
  10. content -> logger.info("Time: {} - event: name[{}], id [{}], content[{}] ",
  11. LocalTime.now(), content.event(), content.id(), content.data()),
  12. error -> logger.error("Error receiving SSE: {}", error),
  13. () -> logger.info("Completed!!!"));
  14. }
展开查看全部

相关问题