Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Rikulo';s dart流服务器?_Dart_Rikulo - Fatal编程技术网

如何在Rikulo';s dart流服务器?

如何在Rikulo';s dart流服务器?,dart,rikulo,Dart,Rikulo,我在尝试使用流服务器上的restful web服务时遇到了一个技术问题 我使用HTTPClient.openUrl从另一个远程服务器检索JSON响应,但一旦连接打开,我就无法再将响应(connect.response.write)写入浏览器客户端 错误如下所示: Unhandled exception: Bad state: StreamSink is closed #0 _FutureImpl._scheduleUnhandledError.<anony

我在尝试使用流服务器上的restful web服务时遇到了一个技术问题

我使用HTTPClient.openUrl从另一个远程服务器检索JSON响应,但一旦连接打开,我就无法再将响应(connect.response.write)写入浏览器客户端

错误如下所示:

    Unhandled exception:
    Bad state: StreamSink is closed
    #0      _FutureImpl._scheduleUnhandledError.<anonymous closure> (dart:async:325:9)
    #1      Timer.run.<anonymous closure> (dart:async:2251:21)
    #2      Timer.run.<anonymous closure> (dart:async:2259:13)
    #3      Timer.Timer.<anonymous closure> (dart:async-patch:15:15)
    #4      _Timer._createTimerHandler._handleTimeout (dart:io:6730:28)
    #5      _Timer._createTimerHandler._handleTimeout (dart:io:6738:7)
    #6      _Timer._createTimerHandler.<anonymous closure> (dart:io:6746:23)
    #7      _ReceivePortImpl._handleMessage (dart:isolate-patch:81:92)
未处理的异常:
错误状态:StreamSink已关闭
#0 \u FutureImpl.\u计划未处理错误。(dart:async:325:9)
#1.运行计时器。(dart:async:2251:21)
#2.运行。(dart:async:2259:13)
#定时器,定时器。(dart:异步修补程序:15:15)
#4(计时器).(创建计时器句柄).(dart:io:6730:28)
#5(计时器)(创建计时器句柄)(dart:io:6738:7)
#6 _定时器。_createTimerHandler。(dart:io:6746:23)
#7_ReceivePortImpl._handleMessage(dart:隔离补丁:81:92)

任何人都知道在流服务器上调用web服务的正确方法吗?

关键是您必须返回Future,因为您的任务(openUrl)是异步的。在示例代码中,您必须执行以下操作:

return conn.then((HttpClientRequest request) {
//^-- notice: you must return a future to indicate when the serving is done
有关更多信息,请参阅。为了避免这种错误,我发布了一篇文章

以下是一个工作示例:

library issues;

import "dart:io";
import "dart:uri";
import "package:rikulo_commons/io.dart" show IOUtil;
import "package:stream/stream.dart";

void main() {
  new StreamServer(uriMapping: {
    "/": (connect)
      => new HttpClient().getUrl(new Uri("http://google.com"))
      .then((req) => req.close())
      .then((res) => IOUtil.readAsString(res))
      .then((result) {
        connect.response.write(result);
      })
  }).start();
}

这是我的原始代码:

void startProcess(HttpConnect connect){
  String method = "GET";

  String url = "http://XXXXXX/activiti-rest/service/deployments";

  Map authentication = {"username":"XXXXX", "password":"XXXXX"};
  Map body = {"XXXXX":"XXXXX", "XXXXX":"XXXXX"};

  processRequest(connect, method, url, authentication, body.toString());
}

void processRequest(HttpConnect connect, String method, String url, Map authentication, String body) {

  HttpClient client = new HttpClient();
  Uri requestUri = Uri.parse(url);

  Future<HttpClientRequest> conn = client.openUrl(method, requestUri);

  conn.then((HttpClientRequest request) {
    request.headers.add(HttpHeaders.CONTENT_TYPE, Constants.CONTENT_TYPE_JSON);
    // Add base64 authentication header, the class is contained in a separate dart file
    String base64 = Base64String.encode('${authentication["username"]}:${authentication["password"]}');
    base64 = 'Basic $base64';
    request.headers.add("Authorization",  base64);

    switch( method ) {
      case Constants.METHOD_GET: break;
      case Constants.METHOD_POST:
        body = body.replaceAllMapped(new RegExp(r'\b\w+\b'), (match) => '"${match.group(0)}"' );//no replacement for now
        request.write(body);
        break;
    }
    return request.close();
  })
  .then((HttpClientResponse response) {
    return IOUtil.readAsString(response);
  })
  .then((String result) {
    connect.response.write(result);
  });
}
void启动过程(HttpConnect){
String method=“GET”;
字符串url=”http://XXXXXX/activiti-rest/service/deployments";
映射身份验证={“用户名”:“XXXXX”,“密码”:“XXXXX”};
映射体={“XXXXX”:“XXXXX”,“XXXXX”:“XXXXX”};
processRequest(连接、方法、url、身份验证、body.toString());
}
void processRequest(HttpConnect连接、字符串方法、字符串url、映射身份验证、字符串正文){
HttpClient=新的HttpClient();
urirequesturi=Uri.parse(url);
Future conn=client.openUrl(方法,requestUri);
conn.then((HttpClientRequest请求){
request.headers.add(HttpHeaders.CONTENT\u TYPE,Constants.CONTENT\u TYPE\u JSON);
//添加base64身份验证标头,该类包含在单独的dart文件中
String base64=Base64String.encode(“${authentication[“username”]}:${authentication[“password”]}”);
base64=‘基本$base64’;
添加(“授权”,base64);
开关(方法){
case Constants.METHOD_GET:break;
case Constants.METHOD_POST:
body=body.replaceAllMapped(新的RegExp(r'\b\w+\b'),(match)=>“${match.group(0)}”;//暂时不替换
请求书(正文);
打破
}
返回请求。close();
})
.然后((HttpClientResponse响应){
返回IOUtil.readAsString(响应);
})
.then((字符串结果){
connect.response.write(结果);
});
}

嗨,汤姆,谢谢你的回复!我要测试一下你的解决方案。下面是我用来使用Acitiviti REST web服务的代码,它抛出“StreamSink已关闭”错误Hi Tom,刚刚尝试使用getUrl,仍然通过相同的异常键返回。请再读一遍我的答案。我澄清了它。我把它合并回你的问题,并修改了我的答案。