2017-10-13 2 views
0

これはthisのフォローアップです。最初は、example from the Qt wikiをチェックアウトした後で問題が解決したと思っていました(私は同じコードを一回変更せずに使用します)。しかし、それは原因であるURLだと思われます。 thisで提供されているリンクを使用して、http GETリクエストをテストしました。 Qtは立ち往生してreadyRead()/finished()信号が放出されることはありませんいくつかの理由についてQNetworkAccessManagerとQNetworkReplyを使用してhttp GET要求を正しく行うにはどうすればよいですか? URLはQtのリクエストにどのように影響しますか?

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

ます:httpリクエスタ(FirefoxのHTTP要求のアドオン()などのPOSTをGET)とcurlを使用すると、このリンク^とは問題を示しません。

結果として、ソケットタイムアウトのために要求が取り消されてしまいます。実際には小さく、Firefoxによって1秒未満で開かれたものについては、

私はHttpのものについては専門家から遠いです。他のツールを使って作業しているときに、Qtでこの現象が発生する理由を知りたいと思います。

編集:私はまた、Pythonとその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 wikiと全く同じコードを使用しています。 1行に変更はありません。 – rbaleksandar

+0

問題の根本原因を調べるには、次の質問に答える必要があります。1)アプリケーションが適切な要求を送信していますか?2)アプリケーションがサーバーから応答を受け取りますか? 3)アプリケーションはサーバーからの応答を適切に処理しますか? – vahancho

答えて

0

私は後ろにいると言及することを忘れました。率直に言って、私はこれを見逃しているばかりか、職場のゲストネットワークをチェックしていない(愚かなプロキシを迂回している)ことにはむしろ馬鹿だと感じています。私の同僚は、HTTP(元のリンク)の代わりに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 wikiの例は実際にはウィジェットですが、努力してくれてありがとう。私自身のアプリケーションはコンソールベースなので、これも必要であることを知っておくと良いでしょう。 – rbaleksandar

+0

私はそれが正しいことを確かめるために、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でアプリケーションをテストしたが問題はなかった。しかし、これらの2つの...私は知らない。 – rbaleksandar

関連する問題