【目的】
- 透過 QHttp 呼叫 Google Translation API 。
【觀念】
- 網路上有兩個範例
- Qt4 Gossip: QHttp http://caterpillar.onlyfun.net/Gossip/Qt4Gossip/QHttp.html
- Qt Network(1) http://wiki.oss.org.tw/index.php/Qt_Network(1)
- 但第一個範例如果需要抓取內含 Query String 的 Url 的話,會出現漏掉Query String 問題,以下為例
http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=hello&langpair=en|ru
用該程式送出,會發現回傳 400(responseStatus),猜測應該是結果有問題。{"responseData": null, "responseDetails": "invalid version", "responseStatus": 400}
用 WireShark 觀察,就可看出原來只送出GET /ajax/services/language/translate HTTP/1.1
問題看起來就是後面的 Query String 沒送出讓 Google Translation 弄迷糊了。
- 要解決這問題,請將 HttpGet.cpp 裡面原本的
http->get(url.path(), file);
改成http->get(url.toEncoded(), file);
- 如果只要抓網頁資料的話,也可嘗試QWebView。
【程式】
- 開一個 Qt GUI Application。
- 類別還是套用第一個範例的 HttpGet類別(HttpGet.cpp/HttpGet.h)。
- maic.cpp
#include <QtGui/QApplication> #include "dialog.h" #include <QUrl> #include "HttpGet.h" #include <iostream> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; w.show(); HttpGet getter; QUrl url("http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=hello&langpair=en|ru"); getter.downloadFile(QUrl(url)); QObject::connect(&getter, SIGNAL(finished()), &a, SLOT(quit())); return a.exec(); }
【結果】
- 打開檔案 translate 就可看到結果。responseStatus 為 200 代表成功。
{"responseData": {"translatedText":"привет"}, "responseDetails": null, "responseStatus": 200}
【問題】
- 如何改成透過使用者 click 一個 push button 來抓取資料,而不是直接放在 main.c 中。
- 在 Qt Demo | Networking | Http Client 嘗試跑一樣的 Query String。
由 WireShark 看起來封包傳送與接收都是成功的。
但打開 translate 這檔案,裡面卻是空的。此問題再找時間研究。(好像是 Vista 上的防毒軟檔Norton檔掉了存檔的動作,之前此範例在 Windows XP 上是成功的)
【其它】
- 此方法也可下載 Google 語音。請記得將下載完後的 translate_tts 改成 translate.mp3 即可。
但目前看起來英文是可行,其他如中文與俄文還需再研究。
【參考】
-
Qt-interest Archive, December 2006 QHttp - problem downloading file
http://lists.trolltech.com/qt-interest/2006-12/thread00553-0.html