2016-12-17 1 views
1

Swift Vapor 프레임 워크를 살펴보고 있습니다.Swift Vapor에서 비동기 적으로 생성 된 본문 청크를 사용하여 응답 본문을 생성하는 방법

SSL 링크에서 얻은 데이터를 타사 시스템 (별표 PBX 서버 ..)에서 클라이언트로 보내지는 응답 본문으로 매핑하는 컨트롤러 클래스를 만들려고합니다.

그래서 '완전한 응답'이 생성 될 때까지 기다리지 않고받은 텍스트 줄 (SSL 연결에서 별도로 획득)을 보내야합니다. 나는 그것이 갈 방법이 될 줄 알았는데

return Response(status: .ok) { chunker in 
    for name in ["joe\n", "pam\n", "cheryl\n"] { 
     sleep(1) 
     try chunker.send(name) 
    } 

    try chunker.close() 
} 

:

이 예제를보고.

하지만 Vapor 서버에 연결하면 REST 호출이 결과로 세 줄을 받기 전에 루프가 완료 될 때까지 대기한다는 것을 알 수 있습니다.

어떻게하면 chunker.send (name)가 루프를 완료하기를 기다리지 않고 문자를 클라이언트로 보내도록 시도 할 수 있습니까?

실제 코드에서 컨트롤러 메소드는 클라이언트에 대한 HTTP 연결을 장시간 열어 잠재적으로 클라이언트에 Asterisk 활동 데이터를 전송하는 즉시 전송할 수 있습니다. 따라서 각 .send (name)는 실제로 마지막 .close() 호출을 기다리지 않고 즉시 클라이언트에 데이터를 전달해야합니다. 더 나은 결과를 생성하지 않은 시도의 chunker.flush()를 추가

은 ..

답변

1

HTTP 요청은 정말 그런 식으로 작동하도록 설계되어 있지 않습니다. 다른 브라우저와 클라이언트는 구현에 따라 다르게 작동합니다.

예를 들어 붙여 넣은 청크 예제에 telnet으로 연결하면 매초마다 데이터가 전송됩니다. 그러나 Safari는 표시하기 전에 전체 응답을 기다립니다.

이렇게 청크 데이터를 안정적으로 보내려면 해당 용도로 설계된 웹 소켓과 같은 프로토콜을 사용해야합니다.

+0

안녕하세요! 메모 해 주셔서 감사합니다. 내가 발견 한 사실은 청킹이 실제로 작동한다는 것입니다. Paw와 Postman 모두 신호의 흐름을 보여줄 정도로 친절하지 않았습니다. – aaberga

+0

Safari, otoh, 모든 일이 일어나는대로 보여줍니다. 그리고 예, 웹 소켓은 이런 종류의 어플리케이션에서 더 이해가됩니다. 하지만 지금은 Vapour가 무료로 (실제로 Telnet 스타일의 링크를 사용하여 Asterisk에 연결하는) SSL 소켓을 테스트하는 빠른 것을 찾고있었습니다. – aaberga

+0

미친 듯이 (HTTP는이 작업을 수행하지 않습니다 ...) GET 통화는 Safari 웹 페이지로 프록시 된 원격 PBX에서 SSL 데이터 흐름을 얻는 데 1 시간 이상 걸릴 수있었습니다. 진짜는 분명히 웹 소켓으로 이동합니다! 그러나 Vapor 안에있는 모든 맛있는 것들에 감사드립니다 !! – aaberga

관련 문제