2015-01-06 4 views
1

나는 다트 서버 응용 프로그램에 대한 몇 가지 테스트를 작성하려고하고 있으며 관련 HttpClientRequest 및 HttpClientResponse 클래스와 함께 HttpClient 클래스를 사용하여 서버에 테스트 요청을 서버를 실행하기 위해 다트 패키지 : io 패키지가 필요하기 때문에이 클래스들을 사용하고 있습니다. 그래서 다트를 가져올 수 없습니다 : html). 이것은 지금까지 상당히 잘 진행되어 왔으며, 테스트는 서버가 올바른 HTTP 상태 코드로 응답을 반환하는지 확인합니다 나는이 시험 통화를 사용하고 코드의 기본입니다 다음과 같습니다.HttpClientResponse에서 응답 본문 가져 오기

Future<HttpClientResponse> makeServerRequest(String method, Uri uri, [String jsonData]) async { 
    HttpClient client = new HttpClient(); 
    HttpClientRequest request = await client.openUrl(method, uri); 
    request.write(jsonData); 
    return request.close(); 
} 

을 지금은 N 상태 코드뿐만 아니라 응답 본문이 올바른지 확인하는 테스트를 작성하십시오. 문제는 HttpClient 클래스에서 응답 본문에 실제로 액세스 할 수있는 것을 찾지 못하는 것입니다. 지금까지 내가 가장 가까이에서 찾을 수 있었던 것은 HttpClientResponse.contentLength 속성이지만 응답 본문의 크기가 실제 크기가 아니라는 것을 알려줍니다.

어떻게 이러한 요청에서 응답 본문을 검색합니까? 또는 당신이 할 수없는 경우, 응답을 읽을 수 있도록 서버 측 응용 프로그램에서 요청을 할 수있는 다른 방법이 있습니까?

답변

2

HttpClientResponse 개체는 Stream, 그래서 당신은 단지 listen() 방법을 읽을 수 있습니다 :

response.listen((List<int> data) { 
    //data as bytes 
}); 

또한 데이터를 구문 분석 dart:convert에서 코덱을 사용할 수 있습니다. 다음의 예는 String으로 응답 내용을 읽

Future<String> readResponse(HttpClientResponse response) { 
    var completer = new Completer(); 
    var contents = new StringBuffer(); 
    response.transform(UTF8.decoder).listen((String data) { 
    contents.write(data); 
    }, onDone:() => completer.complete(contents.toString())); 
    return completer.future; 
} 
+0

완벽한합니다. 나는 [HttpRequest.responseText] (https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:html.HttpRequest#id_responseText)와 비슷한 것을 찾기 위해 열심히 찾고있었습니다. HttpClientResponse 스트림입니다. 빠른 보조 질문 비록 BytesBuilder에서 결과를 디코딩하는 대신 StringBuffer 및 StreamTransformer를 사용하는 이유가 있습니까? –

+0

특별한 이유는 없습니다. 방금 docs에서 사용할 수있는 예제를 개선했습니다 : https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:io.HttpClientResponse. BytesBuilder를 사용하면 더 나은 성능을 얻을 수 있습니다. – luizmineo