【问题标题】:HTTP Requests in C++ without external libraries? [closed]没有外部库的 C++ 中的 HTTP 请求? [关闭]
【发布时间】:2015-05-14 03:21:57
【问题描述】:

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

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

如果有人好奇,我将把它作为一种学习体验来更好地了解 HTTP 请求的工作原理。

【问题讨论】:

  • 标准库里什么都没有,所以不可能。
  • 标准库中没有套接字的概念,你运气不好
  • 最好的选择可能是使用 Boost.Asio,因为它会在未来的某个时候成为 standardized
  • 是的,我链接的文件是标准化提案
  • 您必须使用套接字库进行通信。但是,您可以在不使用 CURL 的情况下执行 HTTP,它是一个简单的基于文本的协议。但是,对于不那么琐碎的任务,您最终会重新发明这么多轮子,以至于您可能一开始就使用CURL。但是对于基本任务,我一直使用套接字(在将它们包装在 std::iostream 中之后)。它非常轻量级并且解决了依赖问题。

标签: c++ httprequest c++14


【解决方案1】:

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

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

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

This link,张贴在 cmets 中,为使用 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>

【讨论】:

  • 是的,我相信这就是我想要做的。我在 Linux 上,但我想让这个跨平台。
猜你喜欢
  • 2015-02-05
  • 2020-05-08
  • 2022-12-06
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多