Flutter Flatter Web-http StreamdResponse作为客户端接收SSE
有一个flifter应用程序,在手机上运行时能够接收SSE文本/事件流事件,但在chrome web上运行时不能接收相同的SSE文本/事件流事件Flutter Flatter Web-http StreamdResponse作为客户端接收SSE,flutter,dart,Flutter,Dart,有一个flifter应用程序,在手机上运行时能够接收SSE文本/事件流事件,但在chrome web上运行时不能接收相同的SSE文本/事件流事件 import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { http.Client _clien
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
http.Client _client;
MyApp() : super() {
print("Ctor called");
subscribe();
}
@override
Widget build(BuildContext context) {
print("building..");
return MaterialApp(
title: 'Flutter SSE',
home: Scaffold(
appBar: AppBar(
title: Text('Receive SSE Events'),
),
body: Center(
child: Text('Ready for events..'),
),
),
);
}
subscribe() async {
print("Subscribing..");
try {
_client = http.Client();
var request = new http.Request("GET", Uri.parse("http://192.168.1.11:8080/myserver/events"));
request.headers["Cache-Control"] = "no-cache";
request.headers["Accept"] = "text/event-stream";
Future<http.StreamedResponse> response = _client.send(request);
print("Subscribed!");
response.asStream().listen((streamedResponse) {
print("Received streamedResponse.statusCode:${streamedResponse.statusCode}");
streamedResponse.stream.listen((data) {
print("Received data:$data");
});
});
} catch(e) {
print("Caught $e");
}
}
unsubscribe() {
_client.close();
}
}
但仍在经历同样的行为,即作为移动应用程序运行时可以接收流式事件,但作为Chrome web应用程序运行时无法接收流式事件
---更新2---
我一直在读到在web浏览器上运行CORS时可能会出现问题,但据我所知,CORS没有问题。服务器端的CORS已配置为接受所有来源(即“*”
),配置为接受“GET”
和“OPTIONS”
方法,并配置为接受所有头(即“*”
)
在Chrome浏览器中调试显示响应返回为200,并且可以看到以下响应标题:
Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Type: text/event-stream;charset=UTF-8
Expires: 0
Pragma: no-cache
transfer-encoding: chunked
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1 ; mode=block
不幸的是,我对http协议了解不够,所以我不知道上面的响应头是否应该成为关注web浏览器上无法接收事件流的原因
作为旁注,颤振/飞镖代码最初是作为angulardart/飞镖代码编写的,该代码在Chrome web浏览器上运行时能够很好地接收流式事件(因此假设CORS配置正确)
在此问题上的任何帮助或建议都将不胜感激。在Chrome上当前版本的Flatter web中,即使是简单的“是”接收流式事件也是可能的,因此您一定是在服务器端做错了什么。或者“不”,这在Chrome上当前版本的Flitter web中不起作用,但最终它将/永远不会起作用,等等
Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Type: text/event-stream;charset=UTF-8
Expires: 0
Pragma: no-cache
transfer-encoding: chunked
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1 ; mode=block