所以之前已经提出过这个问题,但一般的答案指出是使用外部库,如cURLpp。所以我很好奇是否可以仅使用C ++ 14中的标准库来完成HTTP请求。这有多难?
比如说,我想获取一个XML文档并将其存储在要解析的字符串中。要实现这一目标需要采取哪些措施?
如果有人好奇,我这样做是为了更好地理解HTTP请求的工作原理。
答案 0 :(得分:1)
在我看来,您希望在POSIX套接字API之上从头开始实施HTTP协议。我自己做了这件事,非常有趣。
在此处阅读套接字API:http://en.wikipedia.org/wiki/Berkeley_sockets
如果您想在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>