1、HTTP协议的理解:
1.1 首先提供几个自己在开发过程中查阅的网站
·http://blog.csdn.net/kingcodexl/article/details/51306062
·https://developer.mozilla.org/zh-CN/docs/Web
主要了解HTTP的报文格式以及头域的意义。
1.2 HTTP协议的请求方法
HTTP 定义了一组请求方法, 以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作. 虽然他们也可以是名词, 但这些请求方法有时被称为HTTP动词. 每 一个请求方法都实现了不同的语义, 但一些共同的特征由一组共享:: 例如一个请求方法可以是 safe, idempotent, 或 cacheable.
·GET:GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.
·HEAD:HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体只获取响应信息的响应头信息.
·POST:POST方法用于将实体提交到指定的资源,通常导致状态或服务器上的副作用的更改,通俗就是上传文件到服务器.
·PUT:PUT方法用请求有效载荷替换目标资源的所有当前表示。
·DELETE:DELETE方法删除指定的资源。
·CONNECT:CONNECT方法建立一个到由目标资源标识的服务器的隧道。
·OPTIONS:OPTIONS方法用于描述目标资源的通信选项。
·TRACE:TRACE方法沿着到目标资源的路径执行一个消息环回测试。
·PATCH:PATCH方法用于对资源应用部分修改。
(具体的方法怎么使用可以上网查)
1.3 HTTP协议的认证方法(主要解释基本认证 Basic authentication和摘要认证Digest authentication)
·基本认证Basec:是一种用来允许Web浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
把 "用户名+冒号+密码"用BASE64算法加密后的字符串放在http request 中的header Authorization中发送给服务端。
客户端对于每一个realm,通过提供用户名和密码来进行认证的方式。
包含密码的明文传递。
例:
客户端请求:
GET / HTTP/1.1
Host: localhost
Authorization: Basic dG9tOjEyMzQ1Ng
服务器响应(认证成功):
HTTP/1.1 200 OK
Date: Thu, 13 Jun 2013 20:25:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 53
服务器响应(认证失败):
HTTP/1.1 401 Authorization Required
Date: Thu, 13 Jun 2013 20:25:37 GMT
WWW-Authenticate: Basic realm="Users"
·摘要认证Digest:摘要认证是要与服务器至少有两次交互的,首先是发送POST请求,服务器会返回401状态码认证响应,响应中会
有待认证的信息(WWW-Authenticate),客户端根据服务器响应组织认证报文,一般是使用哈希算法返回一个Response头域信息,若认证通过服务器会返
回200状态码通过。
例:
客户端请求:
POST / HTTP/1.1
Host: localhost
服务器响应:
HTTP/1.1 401 Authorization Required
Date: Thu, 13 Jun 2013 20:25:37 GMT
WWW-Authenticate: Digest realm="Hi!", nonce="HSfb5dy15hKejXAbZ2VXjVbgNC8sC1Gq", qop="auth"
客户端认证;
POST / HTTP/1.1
Host: localhost
Authorization: Digest username="tom",
realm="Hi!",
nonce="L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3",
uri="/",
qop=auth,
nc=00000001,
cnonce="c2dc5b32ad69187a",
服务器响应;
HTTP/1.1 200 OK
Date: Thu, 13 Jun 2013 20:25:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 53
(这些算法过程我们可以借用HTTP开源库解决,后面做描述)
2、心跳保活机制:
2.1 简单来说,心跳保活就是在一定时间内发送心跳保活包给对端,以防对端掉线资源未释放,浪费资源。
这个我们可以自己实现定时发送心跳包,最简单的就是使用HTTP开源库设置发送心跳包的时间。
3、断点续传
3.1 断点续传主要是客户端意外的掉线,连接上后依然接着上次传输的位置继续传输,实现断点续传一般
先发送报文获取上次断点的位置,服务器会在Content-Length中说明断点的位置,客户端再设置Content-Rang
来接着上次断点的位置接着传输数据。
3.2 PU2GASG我们是使用HTTP开源库解决的。
4、接下就是关键了,HTTP的开源库libcurl,可以自己在网站上下载:
4.1 curl是开发HTTP协议的程序的开源库,首先提供一个网站:
https://curl.haxx.se/libcurl/c/libcurl.html
网站中有对curl库的使用手册以及一些函数的使用Demo
4.2 介绍几个常用的函数
·curl_global_init
这个函数设置程序环境libcurl的需要。认为它是一个扩展库的加载程序,简单想就是一个初始化函数,它有一些宏,看需要使用,此案例使用的是 CURL_GLOBAL_ALL。
·curl_easy_init
这个函数是你必须调用的接口,它返回的句柄是用来设置报文头域属性的,没有它你将无法设置报文,这个调用必须有一个相应的调用curl_easy_cleanup当操作完成。
·curl_slist_append
官方有专业的解释,但是我看的不太懂,我的理解是自定义设置报文头域,比如设置Content-Type:image/jpeg,注意使用该函数后需要使用curl_easy_setopt将其添加到报文头域中,使用完成后使用curl_slist_free_all函数释放资源。
·curl_easy_setopt
这个函数就厉害了,你必须用到它,它涉及的宏特别多,看需求使用响应的宏,但是有一个宏你是必须使用的,那就是设置URL的宏,在此我们提供几个常用的宏:
CURLOPT_URL:设置需要访问的地址,一般是由I“IP+路劲”或者“域名+路劲”
CURLOPT_HTTPHEADER:将自定义的头域添加到报文中,第三个参数是curl_easy_append的返回值
CURLOPT_WRITEFUNCTION:设置读取服务器响应数据的回调函数
CURLOPT_WRITEDATA:设置传递给读取服务器响应数据的回调函数的唯一参数
CURLOPT_READFUNCTION:设置上传数据到服务器的回调函数
CURLOPT_READDATA:设置传递给上传数据到服务器的回调函数的唯一参数
CURLOPT_HEADERFUNCTION:设置只接收报文头信息的回调函数
CURLOPT_HEADERDATA:传递给接收报文头信息的回调函数的唯一参数
CURLOPT_NOBODY:设置只接受报文头信息
CURLOPT_POST:设置请求方式为POST
CURLOPT_HTTPAUTH:设置认证方式,使用这个宏之后函数的第三个函数设置你所要认证的方式
CURLOPT_USERPWD:设置用户名和密码
CURLOPT_TCP_KEEPALIVE、CURLOPT_TCP_KEEPIDLE、CURLOPT_TCP_KEEPINTVL:这三个宏一般在一起用,设置keepalive的,具体看官网描述
CURLOPT_POSTFIELDS:设置上传数据的缓冲
CURLOPT_POSTFIELDSIZE:设置上传数据的大小
CURLOPT_RANGE:设置Content-Rang的范围
CURLOPT_INFILESIZE_LARGE:设置Content-Rang属性后面的文件总大小
宏还有很多,需要什么用什么,但是想要完全理解需要花一点时间。
·curl_easy_perform
这个函数是将我们已经设置好的报文发送过去,根据返回值可以判断出错信息
·curl_easy_getinfo
这个函数是获取请求或响应报文中特定信息,也是有很多的宏,根据需要选择响应的宏,例:CURLINFO_RESPONSE_CODE获取服务器响应的状态码
·curl_slist_free_all
不做多的解释,就是和curl_slist_append函数连用,释放资源
·curl_easy_cleanup
释放资源