【问题标题】:http request doesn't receive the whole information - Chttp请求没有收到全部信息 - C
【发布时间】:2017-05-19 17:10:56
【问题描述】:

连接到服务器后,我需要使用GET 命令从中获取所有信息。出于某种原因,我不允许在我的 get 命令之后放置 \r\n,所以我发送到服务器的命令类似于 GET http://somethingrandom.com HTTP/1.0。

将请求发送到该地址后,我没有收到与来自终端的普通GET 相同的输出:

更具体地说,我收到以下信息:

  • http 状态
  • 一些奇怪的数据:
    • 日期
    • 服务器
    • 最后修改
    • ETag
    • 接受范围
    • 内容长度
    • 变化
    • 连接
    • 内容类型

我认为\r\n 的作用是完全忽略该信息。 (在这个例子中额外的<head>标签信息)。如果它与我的代码有关(很可能),我会在之后提供。

【问题讨论】:

  • 你读过任何关于 http 协议的内容吗?
  • 请,哦,请先阅读有关 HTTP 协议、Web 服务器和 Web 架构的信息。您确实会收到相同的输出。您刚刚看到了 http 标头,因为您正在以编程方式执行此操作。
  • 我当然做到了..
  • @johnjoe 相信我,你没有。您正在处理 HTTP 标头,并询问它们。它们是协议的支柱。 HTTP 是一个复杂的协议,具有许多含义。在尝试通过 C 中的套接字实现它之前,您需要了解它的消息。

标签: c sockets http


【解决方案1】:

您在终端上使用的第一个命令实际上是程序GET,它使用 Perl LWP 库执行正确的 HTTP 请求并返回响应。您给出的命令末尾的 HTTP/1.0 实际上被忽略了,因为只需要 URL。因此GET 类似于curl 或wget。您甚至可以致电GET --help 了解具体用法。

您在 C 中尝试做的事情是在没有任何库的情况下处理 HTTP。在这种情况下,您必须正确读取和解析响应,即,如果您使用这些命令,则正是 GET、curl 或 wget 命令为您所做的事情。要正确执行此操作,您需要先了解 HTTP 协议。虽然 HTTP/1.0 不是最新的标准,但我建议首先研究它,因为它是最简单的标准,并且仍然被 Web 服务器接受。标准见RFC 1945。

通过阅读标准,您会看到有一个 HTTP 响应标头和正文,由\r\n 分隔。因此,您需要从标题中获取信息才能正确解释正文。在最简单的情况下,您只需剥离标题即可。

【讨论】:

  • 谢谢,Steffen,这是有道理的。我真的很喜欢你的回答 :) 顺便说一句,我正在努力实现你所说的,到目前为止我的输出和以前一样。我已经发布了(在你阅读我的信息时)这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多