没有外部库的 C++ 中的 HTTP 请求?

HTTP Requests in C++ without external libraries?

所以之前有人问过这个问题,但是指向的一般答案是使用外部库,例如 cURLpp。所以我很好奇是否可以仅使用 C++14 的标准库来完成 HTTP 请求。这有多难?

例如,我想获取一个 XML 文档并将其存储在要解析的字符串中。必须采取哪些步骤才能实现这一目标?

如果有人好奇,我这样做是为了更好地了解 HTTP 请求的工作原理。

在我看来,您想在 POSIX 套接字 API 之上从头开始实施 HTTP 协议。我自己做过,挺好玩的

在此处阅读有关插座 API 的信息:http://en.wikipedia.org/wiki/Berkeley_sockets

如果您想在 Windows 上工作,请参阅 here

This link,发表在评论中,为使用 API 提供了一个很好的起点示例,尽管它奇怪地将客户端和服务器作为串行逻辑包含在同一程序中-- 这可能允许它绕过将客户端或服务器实现为独立程序所需的一些调用(例如等待传入连接)。

假设您正在用 C++ 实现 HTTP 服务器,您可以选择将客户端实现为网页(运行 在您最喜欢的浏览器上),如下面的 hack 演示...

<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>