Jimmy Chen

A Programmer

C++实现HTTP Get和Post请求

  因为以前用Java写Android的时候感觉Java已经封装得很好了,HTTP实现的东西都不是很了解。然后就买了本HTTP入门书籍《图解HTTP》来读,快速读完了,那就用C++实现简单的HTTP Get和Post请求吧。

  在编写代码前,还是需要将HTTP Get和Post请求的区别做下说明的,《图解HTTP》这本书毕竟是入门书籍,这两个的区别都没有说得很详细,所以这里借助互联网,参考下W3School对Get和Post方法的总结。

Get和Post请求的区别

在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

  • GET – 从指定的资源请求数据。
  • POST – 向指定的资源提交要被处理的数据

Get方法

请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:

有关 GET 请求的其他一些注释:

  • GET 请求可被缓存
  • GET 请求保留在浏览器历史记录中
  • GET 请求可被收藏为书签
  • GET 请求不应在处理敏感数据时使用
  • GET 请求有长度限制
  • GET 请求只应当用于取回数据

Post方法

请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

有关 POST 请求的其他一些注释:

  • POST 请求不会被缓存
  • POST 请求不会保留在浏览器历史记录中
  • POST 不能被收藏为书签
  • POST 请求对数据长度没有要求

比较 GET 与 POST

下面的表格比较了两种 HTTP 方法:GET 和 POST。

GET POST
后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)
书签 可收藏为书签 不可收藏为书签
缓存 可被缓存 不能缓存
历史 参数保留在浏览器历史中 参数不会保存在浏览器历史中
对数据长度限制 是的。当发送数据时,GET方法向URL添加数据;URL的长度是受限制的(URL的最大长度是2048个字符) 无限制
对数据类型的限制 只允许ASCII字符 没有限制,也允许二进制数据
安全性 和POST相比,GET的安全性较差,因为所发送的数据是URL的一部分。在发送密码或其他,敏感信息时决不能使用GET POST比GET更安全,因为参数不会被保存在浏览器历史或web服务器日志中
可见性 数据在URL中所有人都是可见的 数据不会显示在URL中

下面做一些额外的补充:

  • 数据类型限制这一块,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
  • 对于数据长度的限制一部分找到其他的说法,首先是”GET方式提交的数据最多只能是2048字节”,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

OK,概念性的东西就介绍到这里了,下面还要多介绍一个Linux函数的使用:gethostbyname

gethostbyname()函数说明

想要使用gethostbyname需要包含的头文件

函数原型:

hostent结构体的定义如下:

下面是结构体各个字段的解析:

  • hostent->h_name:表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。

  • hostent->h_aliases:表示的是主机的别名.www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。

  • hostent->h_addrtype:表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是pv6(AF_INET6)

  • hostent->h_length:表示的是主机ip地址的长度

  • hostent->h_addr_lisst:表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。

下面通过一个代码讲解一下这个函数的使用:

最后运行打印的结果如下:

获取到了IP地址后,其实可以直接通过IP地址来访问baidu,但是因为我的博客使用共享主机,所以直接通过IP地址访问好像有问题,具体原因博主也不是很清楚。但是访问通过IP地址来访问baidu是没问题的,大家可以试一试。

C++实现GET和POST请求

HttpGetPostMethod头文件如下:

源码文件如下:

上面的代码暂时就这样子处理了,使用方法也很简单,如下是使用一个易源数据的开放API查询基金相关的信息,大家也可以使用这个来试一试上面的代码:

  1. 木愚说道:

    十分感谢你的文章
    有个小瑕疵,gethostbyname用法介绍,关于kTestHostName2的代码中,有些地方hostent2写成了hostent1

回复 木愚 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注