所以這個問題之前已經被問過了,但是一般的答案是使用了一個外部庫,比如cURLpp。所以我很好奇,是否只能使用C++ 14的標準庫來完成HTTP請求。這會有多困難?C++中的HTTP請求無外部庫?
舉例來說,我想獲取一個XML文檔並將其存儲在一個字符串中進行解析。要實現這一目標需要採取哪些步驟?
如果有人很好奇,我將以此爲學習體驗來更好地理解HTTP請求的工作方式。
所以這個問題之前已經被問過了,但是一般的答案是使用了一個外部庫,比如cURLpp。所以我很好奇,是否只能使用C++ 14的標準庫來完成HTTP請求。這會有多困難?C++中的HTTP請求無外部庫?
舉例來說,我想獲取一個XML文檔並將其存儲在一個字符串中進行解析。要實現這一目標需要採取哪些步驟?
如果有人很好奇,我將以此爲學習體驗來更好地理解HTTP請求的工作方式。
聽起來對我來說,你想在POSIX套接字API之上從頭開始實現HTTP協議。我自己做了這個,很有趣。
閱讀關於這裏的套接字API:
如果你想在Windows上工作,看到here。
This link,發表在評論中,爲使用API提供了一個非常好的起點示例,儘管它在同一個程序中奇怪地將客戶端和服務器都包含爲串行邏輯 - 這可能會讓它繞過一些的呼叫(如等待傳入連接),以實現客戶端或服務器作爲獨立程序。
假設你正在實現在C++中的HTTP服務器,你可能會選擇實現客戶端的網頁(你喜歡的瀏覽器中運行),如下面的黑客演示...
<html>
<head>
</head>
<body>
This web page sends the entered text back to the server upon a button press.
The server's response is then displayed in the box below.
This is only a hack for learning purposes, and not a demonstration of best-practices.
<br>
<textarea id="INP">
Hello world!
</textarea>
<br>
<button onclick="return make_request('INP','GET','test1')">GET Request</button>
<button onclick="return make_request('INP','POST','test2')">POST Request</button>
<div id="result" style='border-style:solid;'>?</div>
<script>
function make_request(textID, request_type, webfn)
{
var url = "" + "?webfn="+webfn // assumes this page was served by the same server
if (request_type != 'POST') url += "&value="+document.getElementById(textID).value;
var req = new XMLHttpRequest();
req.open(request_type, url, /*async*/false);
req.send(request_type=='POST' ? document.getElementById(textID).value : null);
if (req.readyState == 4/*complete*/ && req.status == 200/*OK*/)
{
result = req.responseXML.documentElement.getElementsByTagName('value')[0].firstChild.data;
document.getElementById('result').innerHTML = req.responseText;
}
else alert("HTTP request failed");
return false;
}
</script>
</body>
</html>
是的,我相信這是我想做的事情。我在Linux上,但我想做出這個跨平臺。 – Brandon
沒有什麼在標準庫中,所以這是不可能的。 –
標準庫中沒有套接字的概念,你運氣不好 –
更確切地說,在Plan 9這樣的系統上,你可以建立網絡連接,只是做僞文件I/O,所以我敢打賭它可能是 –