2013-05-01 2 views
1

Stream 서버에서 안정적인 웹 서비스를 사용하려고 할 때 기술적 인 문제가 발생했습니다.Rikulo의 다트 스트림 서버에서 웹 서비스를 호출하는 방법은 무엇입니까?

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) 

어느 하나 스트림 서버에서 웹 서비스를 호출하는 올바른 방법을 알고 :

이 오류는 다음과 같이 표시됩니다?

답변

2

당신의 작업 (openUrl)이 비동기이기 때문에 열쇠는 미래를 돌려줘야한다는 것입니다. 자세한 내용은

return conn.then((HttpClientRequest request) { 
//^-- notice: you must return a future to indicate when the serving is done 

Request Handling 참조 : 샘플 코드에서, 당신은해야한다. 이러한 종류의 실수를 피하기 위해 a feature request here을 게시합니다.

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(); 
} 
+0

안녕하세요 톰, 회신 주셔서 감사합니다

여기에 작업 예제입니다! 당신의 해결책을 시험해 볼게. 다음은 Acitiviti REST 웹 서비스를 사용하기 위해 사용하는 코드이며 "StreamSink가 닫혔습니다."라는 오류가 발생했습니다. – user2338071

+0

안녕하세요 Tom, getUrl을 사용해 보았습니다. 여전히 동일한 예외가 throw되었습니다. – user2338071

+0

키가 반환됩니다. 내 대답을 다시 읽어주십시오. 나는 그것을 분명히했다. –

0

여기 내 원래의 코드입니다 :

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); 
    }); 
} 
+0

나는 당신의 질문에 그것을 다시 병합하고 내 대답을 수정. –