記錄下之前qt做的解析http和https的檔案資訊的過程。
qt這邊已經提供了network給我們解析,所以不是特殊的話,沒必要再去找其他庫來解決。主要思路是傳送請求後,等待觸發解析結束的訊號,然後接收這個訊號去解析裡面的內容。
同時要獲取檔名的話,會有多種情況要去解析。
1、網頁裡面已經寫好了content-disposition,那麼可以直接解析出這個欄位來獲取filename。
2、沒有content-disposition,那麼就去獲取它的basename。
3、還需要考慮到多級跳轉情況,這個時候要跳轉多次才能獲取到disposition或者真正目標位址的basename。
4、下面**只供思路參考,用的時候不建議直接copy。
#include
#include
#include
//....省略....
protected
: qnetworkaccessmanager m_manager;
// 傳送請求和接收應答
qnetworkrequest m_request;
// 儲存準備傳送的請求
qnetworkreply *m_reply;
// 接收到的應答
qurl m_url;
// 要解析的位址
qstring m_strfilename;
// 存放解析出來的檔名
qstring m_strfilesize;
// 存放解析出來的檔案的大小
/** * @brief parse2filename 解析url,該操作是非同步
* @param url 要解析的位址
*/void
parsefileinfo
(std::string url)
;private slots:
void
ongetheaders()
;
void ***x::
parsefileinfo
(std::string url)
void ***x::
ongetheaders()
}else
//如果沒有content-disposition,則用qurl獲取basename}if
(m_reply-
>
hasrawheader
("content-length"))
else
}
上面這樣,就能獲取到沒有跳轉的http的檔案資訊了。但是如果出現多級跳轉的話,是無法正確拿到的。這邊有兩個做法:
1、如果解析出來的header裡面有location,那麼就套娃解析,直到沒有,然後再去取檔名。
2、初始化request時候,設定request屬性,讓request自己幫我們跳轉。
m_request.
setattribute
(qnetworkrequest::followredirectsattribute,
true
);
採用這兩種方法,碰到跳轉的鏈結時候,都能正確拿到url。
qdebug()
<< qsslsocket::
supportsssl()
<< qsslsocket::
ssllibrarybuildversionstring()
<< qsslsocket::
ssllibraryversionstring()
;
可以事先列印這句話,如果是false那就是不支援https的,如果是true,那麼解析https一般就沒問題了。當然這是我自己遇到的情況,不是適合所有人。 關於jsoup解析http文件
1.第一次用jsoup,是用來解析乙個關於新聞的網頁,但是這個網頁比較簡單,所以對於jsoup的了解不是很清楚。2.在寫android程式時,有時需要解析html頁面,特別是那類通過爬 抓取資料的應用,比如 天氣預報等應用。如果是桌面應用可以使用htmlparser這個強大的工具,但是在androi...
關於Http協議的解析
http概述 http hypertext transport protocol 即超文字傳輸協議。這個協議詳細規定了瀏覽器和全球資訊網伺服器之間互相通訊的規則。http就是乙個通訊規則,通訊規則規定了客戶端傳送給伺服器的內容格式,也規定了伺服器傳送給客戶端的內容格式。其實我們要學習的就是這個兩個格...
HTTP報文解析
超文字傳輸協議 hypertext transfer protocol,簡稱http 是應用層協議。http 是一種請求 響應式的協議,即乙個客戶端與伺服器建立連線後,向伺服器傳送乙個請求 伺服器接到請求後,給予相應的響應資訊。http請求報文分為三部分 請求行 請求頭部 請求包體 由方法字段 ur...