从飞镖渡槽后端向邮递员发送回复

sending response to postman from dart aqueduct backend

我创建了一个休息 post 端点,我正在其中进行第三方 API 调用,我从第三方 API 获得的响应作为响应发送来自其余端点

代码如下:

@override
  Controller get entryPoint {
    String dataRecieved;
    var completer = new Completer();
    var contents = new StringBuffer();
    final router = Router();

    // Prefer to use `link` instead of `linkFunction`.
    // See: https://aqueduct.io/docs/http/request_controller/
    router.route("/uploadurl").linkFunction((request) async {
      final req = await request.body.decode();
      var envalue = json.encode(req);
      print(envalue);
//      print( await request.body.decode());
      HttpClient client = new HttpClient();
      client.badCertificateCallback =
          ((X509Certificate cert, String host, int port) => true);
      var auth = 'Bearer ' +
          'eyJ...';

      await client
          .postUrl(Uri.parse(
              'https://<removed>/api/datalake/v3/generateDownloadObjectUrls'))
          .then((HttpClientRequest requestSend) {
        requestSend.headers
            .add("Content-Type", "application/json; charset=UTF-8");
        requestSend.headers.add("Authorization", auth);
        print(req);
        requestSend.write(envalue);
        return requestSend.close();
      }).then((HttpClientResponse response) async {
        print(await response.contentLength);
        var resStream = response.transform(Utf8Decoder());
        await for (var data in resStream) {
          print('Received data: $data');
          contents.write(data);
        }
        print(await response.statusCode);


      }).catchError((e) {
        print("Request error: $e"); // The only case
      });

      print(contents);
//      var filValue = contents.toString();
      return Response.ok(contents);
    }); 

在这一行 return Response.ok(contents.toString()) 我得到 json 转换异常

这是我得到的异常,插入得到这个异常它应该发送 JSON 返回调用 postman:

[SEVERE] aqueduct: POST /uploadurl 1047ms 500 {user-agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36\nconnection : keep-alive\
ncache-control : no-cache\npostman-token : 8ba3e1e9-38c7-37ac-da97-5bb3de983622\naccept-encoding : gzip, deflate, br\ncontent-type : application/json\nsec-fetch-site : cross-site\naccept : */*\nsec-fe
tch-mode : cors\naccept-language : en-US,en;q=0.9\norigin : chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop\ncontent-length : 103\nhost : localhost:8888\n}  Converting object to an encodable objec
t failed: Instance of 'StringBuffer' #0      _JsonStringifier.writeObject (dart:convert/json.dart:649:7)
#1      _JsonUtf8Stringifier.stringify (dart:convert/json.dart:902:17)
#2      JsonUtf8Encoder.convert (dart:convert/json.dart:371:26)
#3      _FusedConverter.convert (dart:convert/converter.dart:69:48)
#4      Codec.encode (dart:convert/codec.dart:23:32)
#5      Request._responseBodyBytes (package:aqueduct/src/http/request.dart:340:18)
#6      Request.respond (package:aqueduct/src/http/request.dart:251:14)
#7      Controller._sendResponse (package:aqueduct/src/http/controller.dart:339:20)
#8      Controller.receive (package:aqueduct/src/http/controller.dart:176:17)
<asynchronous suspension>
#9      Controller.receive (package:aqueduct/src/http/controller.dart:206:28)
<asynchronous suspension>
#10     Router.receive (package:aqueduct/src/http/router.dart:139:18)
#11     _RootZone.runUnaryGuarded (dart:async/zone.dart:1316:10)
#12     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:338:11)
#13     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:265:7)
#14     _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:134:11)
#15     _MapStream._handleData (dart:async/stream_pipe.dart:234:10)
#16     _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:166:13)
#17     _RootZone.runUnaryGuarded (dart:async/zone.dart:1316:10)
#18     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:338:11)
#19     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:265:7)
#20     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:766:19)
#21     _StreamController._add (dart:async/stream_controller.dart:642:7)
#22     _StreamController.add (dart:async/stream_controller.dart:588:5)
#23     _HttpServer._handleRequest (dart:_http/http_impl.dart:2828:19)
#24     new _HttpConnection.<anonymous closure> (dart:_http/http_impl.dart:2586:19)
#25     _RootZone.runUnaryGuarded (dart:async/zone.dart:1316:10)
#26     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:338:11)
#27     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:265:7)
#28     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:766:19)
#29     _StreamController._add (dart:async/stream_controller.dart:642:7)
#30     _StreamController.add (dart:async/stream_controller.dart:588:5)
#31     _HttpParser._headersEnd (dart:_http/http_parser.dart:388:17)
#32     _HttpParser._doParse (dart:_http/http_parser.dart:703:15)
#33     _HttpParser._parse (dart:_http/http_parser.dart:320:7)
#34     _HttpParser._onData (dart:_http/http_parser.dart:812:5)
#35     _RootZone.runUnaryGuarded (dart:async/zone.dart:1316:10)
#36     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:338:11)
#37     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:265:7)
#38     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:766:19)
#39     _StreamController._add (dart:async/stream_controller.dart:642:7)
#40     _StreamController.add (dart:async/stream_controller.dart:588:5)
#41     _Socket._onData (dart:io-patch/socket_patch.dart:1831:41)
#42     _RootZone.runUnaryGuarded (dart:async/zone.dart:1316:10)
#43     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:338:11)
#44     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:265:7)
#45     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:766:19)
#46     _StreamController._add (dart:async/stream_controller.dart:642:7)
#47     _StreamController.add (dart:async/stream_controller.dart:588:5)
#48     new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1379:33)
#49     _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:899:14)
#50     _microtaskLoop (dart:async/schedule_microtask.dart:43:21)
#51     _startMicrotaskLoop (dart:async/schedule_microtask.dart:52:5)
#52     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:118:13)
#53     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:175:5)

这是我从第三方 API 获得的数据,我正尝试从我的休息区 API 发送作为响应:

{"objectUrls":[{"signedUrl":"https://example.com","path":"folder3/sub1/mysensordata.log"}]}

在网上看了一些博客后,我找到了一个方法:

@override
  Controller get entryPoint {
    final router = Router();
    HttpClientResponse responseTemp;

    // Prefer to use `link` instead of `linkFunction`.
    // See: https://aqueduct.io/docs/http/request_controller/
    router.route("/uploadurl").linkFunction((request) async {
      final req = await request.body.decode();
      final envalue = json.encode(req);

      HttpClient client = new HttpClient();
      client.badCertificateCallback =
          ((X509Certificate cert, String host, int port) => true);
      var auth = 'Bearer ' +
          'eyJ...';

      await client
          .postUrl(Uri.parse('http://example.com/v2/5e104a9235000079001e68e7'))
          .then((HttpClientRequest requestSend) {
        requestSend.headers
            .add("Content-Type", "application/json; charset=UTF-8");
        requestSend.write(envalue);
        return requestSend.close();
      }).then((HttpClientResponse response) async {
        responseTemp = response;
      }).catchError((e) {
        print("Request error: $e"); // The only case
      });

      await for (var contents in responseTemp.transform(Utf8Decoder())) {
        print(contents);
        return Response.ok(json.decode(contents.toString()));
      }
      return Response.noContent();
    });

    router.route("/secondurl").linkFunction((request) async {
      return Response.ok({"key": "adf"});
    });
    return router;
  }

这对我有用。