2015-05-14 70 views
1

所以這個問題之前已經被問過了,但是一般的答案是使用了一個外部庫,比如cURLpp。所以我很好奇,是否只能使用C++ 14的標準庫來完成HTTP請求。這會有多困難?C++中的HTTP請求無外部庫?

舉例來說,我想獲取一個XML文檔並將其存儲在一個字符串中進行解析。要實現這一目標需要採取哪些步驟?

如果有人很好奇,我將以此爲學習體驗來更好地理解HTTP請求的工作方式。

+0

沒有什麼在標準庫中,所以這是不可能的。 –

+3

標準庫中沒有套接字的概念,你運氣不好 –

+0

更確切地說,在Plan 9這樣的系統上,你可以建立網絡連接,只是做僞文件I/O,所以我敢打賭它可能是 –

回答

1

聽起來對我來說,你想在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> 
+0

是的,我相信這是我想做的事情。我在Linux上,但我想做出這個跨平臺。 – Brandon