2017-10-13 17 views
0

후속 조치 : this입니다. 처음에는 example from the Qt wiki을 확인한 후에 문제가 해결 된 것으로 생각했습니다 (동일한 코드를 변경하지 않고 사용). 그러나 범인 인 URL 인 것으로 보입니다. 내 http GET 요청을 테스트하기 위해 this 대답에 제공된 링크를 사용하여 시도했습니다. Qt는이 걸리면 어떤 이유QNetworkAccessManager 및 QNetworkReply를 사용하여 http GET 요청을 올바르게 수행하는 방법은 무엇입니까? URL이 Qt의 요청에 어떻게 영향을 줍니까?

$~: curl --request GET --url "http://httpbin.org/ip" 

readyRead()/finished() 신호가 방출되지 않습니다 :는 HTTP 요청자 사용 (GET (HTTP 요청을 파이어 폭스 애드온을, POST 등)) 및 curl이 링크^어떠한 문제를 보여줍니다 .

결과적으로 소켓 시간 제한으로 인해 시간이 지나면 요청이 취소됩니다 ... 실제로는 작고 Firefox에서는 1 초 이내에 열 수 없습니다.

나는 Http에 관해서는 전문가가 아니다. 이 문제가 Qt에서 발생하는 이유는 알고 싶습니다. 반면 다른 도구로 작업 할 때는 아무런 징조가 없습니다.

편집 : 나는 또한 파이썬과의 urllib

import urllib.request 
res = urllib.request.urlopen("http://httpbin.org/ip").read().decode("utf-8") 

import xml.etree.ElementTree as ET 
doc = ET.fromstring(res) 

을 사용하여 문제가있는 URL을 테스트했습니다 그것은 잘 작동. 분명히 Qt를 사용하거나 무언가 누락 된 뭔가가 있습니다.

EDIT2 : 또한 HTTP 요청에 대한 다른 테스트 서비스 (https://postman-echo.com)를 시도했습니다. 하나 Qt는 아무 문제가 없지만 놀랍게도 들어

$~: curl --request GET --url "https://postman-echo.com/get?foo1=bar1&foo2=bar2" 

: curl로 문제가 없습니다! 가장 큰 차이점은 여기서 postman-echo.com은 HTTPS를 사용했지만 시도한 다른 URL은 HTTP를 사용한다는 것입니다. Qt 예제의 기본 URL 인 https://www.qt.io을 제외하고 아무런 매개 변수도 없었지만 제대로 작동했습니다.

+0

문제를 이해하는 데 도움이되도록 코드를 표시해야합니다. – vahancho

+0

@vahancho 나는 Qt 위키에서 똑같은 코드를 사용한다. 단 한 줄도 바뀌지 않았습니다. – rbaleksandar

+0

문제의 근본 원인을 찾으려면 다음 질문에 답해야합니다. 1) 내 애플리케이션이 적절한 요청을 보내나요?, 2) 애플리케이션이 서버로부터 응답을 받습니까? 3) 응용 프로그램이 서버에서 가져온 응답을 제대로 처리합니까? – vahancho

답변

0

나는 뒤에서 언급 한 것을 잊었습니다. 솔직히 나는 이것을 놓치고 일하는 게스트 네트워크를 (어리석은 프록시를 우회하는) 점검하지 않고 오히려 어리 석다. 내 동료가 원래의 링크 인 HTTP 대신 S을 사용해 보았습니다. HTTPS는 또한 프록시가 아무 문제없이 통과 할 수있는 것입니다. 그리고 효과가있었습니다.

그러나 좀 더 중립적 인 해결책은 동료와 마찬가지로 QNetworkProxyFactory::setUseSystemConfiguration(true)을 사용하는 것입니다. 이는 시스템 전체에 적용되는 프록시 구성을 사용합니다.

0

이벤트 루프에서 실행 해보십시오. 다음은 비 GUI 응용 프로그램에서 내가 수행하는 것과 비슷한 내용입니다.

QUrl req_url = QUrl(href); 
QNetworkRequest request(req_url); 

//request.setRawHeader("Content-Type", "application/json;utf8"); 
//q_nam is QNetworkAccessManager created earlier 
QNetworkReply *reply = q_nam->get(request); 

QEventLoop event_loop; 
connect(q_nam, SIGNAL(finished(QNetworkReply *)), &event_loop, SLOT(quit())); 
event_loop.exec(); // blocks stack until "finished()" has been called 
event_loop.processEvents(QEventLoop::ExcludeUserInputEvents, 500);//what events to processed and for how long 
event_loop.exit(); 

QNetworkReply::NetworkError er = reply->error(); 
// ....continue handling 
+0

작동하지 않고 소켓 시간 제한을 계속받습니다. 또한 Qt 위키의 예제는 실제로 위젯이지만 노력에 감사드립니다. 내 자신의 응용 프로그램은 콘솔 기반이 될 것이므로 내가 필요한 것도 알고있는 것이 좋다. – rbaleksandar

+0

URL이 올바른지 확인하기 위해 URL은 http : //bvg.hafas.de/bin/monitor_hci/stboard.exe/dn? input = 9054102 & start = 1 & output = xml'입니까? – cantSleepNow

+0

둘 다 작동하지 않습니다 - httpbin.org와 bvg.hafas.de에서 제공 한 것. 나는 많은 다른 URL로 응용 프로그램을 테스트했지만 문제가 없었습니다. 하지만이 두 사람과 나는 ... 모르겠다. – rbaleksandar