从dart导水管后端向邮递员发送响应

从dart导水管后端向邮递员发送响应,dart,aqueduct,Dart,Aqueduct,我已经创建了一个rest post端点,其中我正在进行第三方API调用,并且我从第三方API获得的响应将作为来自rest端点的响应发送 代码如下: @override Controller get entryPoint { String dataRecieved; var completer = new Completer(); var contents = new StringBuffer(); final router = Router(); /

我已经创建了一个rest post端点,其中我正在进行第三方API调用,并且我从第三方API获得的响应将作为来自rest端点的响应发送

代码如下:

@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);
    }); 

在阅读了互联网上的一些博客后,我找到了一种方法:

@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;
  }

这对我有效。

如果这是一个愚蠢的问题,很抱歉,但错误似乎表明您已将一个StringBuffer实例作为参数提供给
Response.ok()
。如果您查看已发布的代码(
return-Response.ok(contents);
),但您在文本中说的是其他内容(
return-Response.ok(contents.toString());
)。因此,我的问题是,当您遇到异常时,您实际执行的代码是什么?我仍在寻找解决方案,因此我对内容或内容进行了一些更改。toString返回相同的错误更改此行:
return Response.ok(contents)
to
返回Response.ok(contents.toString())
{"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;
  }