使用Eden AI API生成图片时遇ClientException连接关闭错误求助
问题:调用Eden AI图片生成API时出现连接中断异常
调用Eden AI的图片生成API时,程序抛出Unhandled Exception: ClientException: Connection closed while receiving data异常,错误日志和相关代码如下:
错误日志
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: ClientException: Connection closed while receiving data, uri=https://api.edenai.run/v2/image/generation E/flutter ( 4656): #0 IOClient.send.<anonymous closure> (package:http/src/io_client.dart:110:13) E/flutter ( 4656): #1 Stream.handleError.<anonymous closure> (dart:async/stream.dart:931:16) E/flutter ( 4656): #2 _HandleErrorStream._handleError (dart:async/stream_pipe.dart:269:17) E/flutter ( 4656): #3 _ForwardingStreamSubscription._handleError (dart:async/stream_pipe.dart:157:13) E/flutter ( 4656): #4 _HttpClientResponse.listen.<anonymous closure> (dart:_http/http_impl.dart:720:16) E/flutter ( 4656): #5 _RootZone.runBinaryGuarded (dart:async/zone.dart:1606:10) E/flutter ( 4656): #6 _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:358:15) E/flutter ( 4656): #7 _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:376:7) E/flutter ( 4656): #8 _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:280:7) E/flutter ( 4656): #9 _ForwardingStreamSubscription._addError (dart:async/stream_pipe.dart:128:11) E/flutter ( 4656): #10 _addErrorWithReplacement (dart:async/stream_pipe.dart:176:8) E/flutter ( 4656): #11 _HandleErrorStream._handleError (dart:async/stream_pipe.dart:274:11) E/flutter ( 4656): #12 _ForwardingStreamSubscription._handleError (dart:async/stream_pipe.dart:157:13) E/flutter ( 4656): #13 _RootZone.runBinaryGuarded (dart:async/zone.dart:1606:10) E/flutter ( 4656): #14 _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:358:15) E/flutter ( 4656): #15 _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:376:7) E/flutter ( 4656): #16 _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:280:7) E/flutter ( 4656): #17 _SyncStreamControllerDispatch._sendError (dart:async/stream_controller.dart:788:19) E/flutter ( 4656): #18 _StreamController._addError (dart:async/stream_controller.dart:666:7) E/flutter ( 4656): #19 _StreamController.addError (dart:async/stream_controller.dart:620:5) E/flutter ( 4656): #20 _HttpParser._reportBodyError (dart:_http/http_parser.dart:1200:22) E/flutter ( 4656): #21 _HttpParser._onDone (dart:_http/http_parser.dart:898:9) E/flutter ( 4656): #22 _RootZone.runGuarded (dart:async/zone.dart:1582:10) E/flutter ( 4656): #23 _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13) E/flutter ( 4656): #24 _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7) E/flutter ( 4656): #25 _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7) E/flutter ( 4656): #26 _SyncStreamControllerDispatch._sendDone (dart:async/stream_controller.dart:792:19) E/flutter ( 4656): #27 _StreamController._closeUnchecked (dart:async/stream_controller.dart:647:7) E/flutter ( 4656): #28 _StreamController.close (dart:async/stream_controller.dart:640:5) E/flutter ( 4656): #29 _Socket._onError (dart:io-patch/socket_patch.dart:2471:19) E/flutter ( 4656): #30 _RootZone.runBinaryGuarded (dart:async/zone.dart:1606:10) E/flutter ( 4656): #31 _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:358:15) E/flutter ( 4656): #32 _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:373:9) E/flutter ( 4656): #33 _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:280:7) E/flutter ( 4656): #34 _SyncStreamControllerDispatch._sendError (dart:async/stream_controller.dart:788:19) E/flutter ( 4656): #35 _StreamController._addError (dart:async/stream_controller.dart:666:7) E/flutter ( 4656): #36 _StreamController.addError (dart:async/stream_controller.dart:620:5) E/flutter ( 4656): #37 _RawSecureSocket._reportError (dart:io/secure_socket.dart:888:19) E/flutter ( 4656): #38 _RawSecureSocket._pushAllFilterStages (dart:io/secure_socket.dart:1155:9) E/flutter ( 4656): <asynchronous suspension> E/flutter ( 4656): #39 _RawSecureSocket._tryFilter (dart:io/secure_socket.dart:1006:25) E/flutter ( 4656): <asynchronous suspension>
相关代码
static Future<void> getImage(String question) async { final res = await http.post(Uri.parse('https://api.edenai.run/v2/image/generation'), headers: { HttpHeaders.contentTypeHeader: ' application/json', HttpHeaders.authorizationHeader: 'Bearer $apiKey' }, body: jsonEncode({ "providers": "openai,deepai,stabilityai", "text": "A huge red ballon flying outside the city.", "resolution": "512x512", "num_images": 2 })); final data = await jsonDecode(res.body); log('res: ${res.body} + ${res.statusCode}'); }
解决办法
1. 修复请求头的Content-Type错误
原代码中Content-Type的值前面有多余空格' application/json',这会导致服务器无法正确解析请求格式,修改为:
HttpHeaders.contentTypeHeader: 'application/json',
2. 设置请求超时时间
图片生成API处理时间较长,默认超时可能不足以完成响应,使用自定义http.Client设置超时:
static Future<void> getImage(String question) async { final client = http.Client()..idleTimeout = const Duration(minutes: 2); try { final res = await client.post( Uri.parse('https://api.edenai.run/v2/image/generation'), headers: { HttpHeaders.contentTypeHeader: 'application/json', HttpHeaders.authorizationHeader: 'Bearer $apiKey' }, body: jsonEncode({ "providers": "openai,deepai,stabilityai", "text": "A huge red ballon flying outside the city.", "resolution": "512x512", "num_images": 2 }), ).timeout(const Duration(minutes: 2)); final data = jsonDecode(res.body); log('res: ${res.body} + ${res.statusCode}'); } on ClientException catch (e) { log('连接异常: ${e.message}'); } on TimeoutException catch (e) { log('请求超时: ${e.message}'); } catch (e) { log('其他异常: ${e.toString()}'); } finally { client.close(); } }
3. 减少并发provider数量
同时调用3个provider会增加响应数据量和服务器处理压力,可能导致连接提前关闭。先尝试只使用一个provider测试:
"providers": "openai",
4. 添加异常捕获逻辑
原代码未处理任何异常,导致未捕获的ClientException崩溃,在代码中添加try-catch可以捕获异常并定位问题。
内容的提问来源于stack exchange,提问作者Manish sahu
相关产品推荐
相关产品推荐

