curl针对HTTP的相关使用方法

虽然cURL支持多种协议,但日常我们最常用的还是HTTP协议,下文中着重介绍HTTP的相关使用方法,因此我们要对HTTP协议有所了解。

HTTP,超文本传送协议,通过因特网传送万维网文档的数据传送协议。

我们访问一个网页的实际过程如下:

1 客户端C===HTTP请求===>服务端S:GET index.html http/1.1
2 客户端C<==HTTP响应====服务端S:HTTP/1.1 200 OK HTML文件内容

HTTP协议本身是个无状态协议,它不像其他基于会话的协议那样去不断追踪、记忆事务处理过程。而它要做的就只是简单的

连接=>发起HTTP请求(HTTP Request)=>得到HTTP响应(HTTP Response)=>断开连接

而平常我们通过浏览器浏览网页这个过程,浏览器自动完成发送HTTP请求及对服务端应答的数据进行解析的工作,从而将网页呈现给我们。

我们使用cURL要做的就是模仿浏览器的动作,因此要对HTTP请求的格式进行进一步的解析。

一、HTTP请求

在你向HTTP服务器请求一个资源(比如简单的使用浏览器打开一个网页),TCP三次握手建立连接后,HTTP请求发出。

HTTP请求信息由3部分组成:l 请求行(Request Line)l 请求头(Request Header)l 请求正文(Message Body)

 

 1、HTTP请求行

典型的HTTP请求行格式为:

 HTTP命令 请求资源的URI HTTP版本号

HTTP请求行例子如下:

GET / HTTP/1.1\r\n

这个请求行的意思是:请求得到(GET)/路径下的默认主页文件,使用HTTP协议1.1版本。

根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、 POST、HEAD、OPTIONS、PUT、DELETE和TARCE。而服务器也可以自定义请求命令供客户端使用。具体请参考HTTP的RFC文档。 而我们最常用的是GET和POST命令:

1)GET命令

GET主要用于取得URL指定的资源信息,也可用来提交表单。GET提交的信息实际上是附加在url之后作为URL的一部分。

当年盛行一时的SQL注入,最常见的检测手段就是在GET提交的链接后加单引号来检测是否存在注入漏洞。

如提交username和password两个字段,正常的GET网址如下:

http://www.xxx.com/login.php?username=user&password=pass

网站后台就会在_GET数组中取得username和password的值,从而组建SQL语句:

select count(*) from user_table where username=user and password=pass

如果返回的count值大于0即为用户名密码正确。

而添加单引号后:

http://www.xxx.com/login.php?username=user&password=pass'

组建的SQL语句为

select count(*) from user_table where username=user and password=pass'

这个SQL语句执行出错,网页显示错误信息,黑客从而得知网页有SQL注入漏洞。

因此使用GET提交表单是不安全的,只进行了简单的编码无法加密,可以很容易的从网址猜出各字段的意思。而且受限于URL长度限制,GET提交表单能携带的数据也有限。

2)POST命令

POST主要用于提交表单,尤其是提交大批量的表单数据。

POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法加密和数据量太小的缺点。

HTTP请求的下一段数据为HTTP请求头。

2、HTTP请求头

HTTP请求头中主要包含关于请求本身或者客户端的有用信息,比如浏览器的类型、浏览器语言、编码、压缩算法等信息。服务器上的动态脚本如PHP等可以利用请求头信息生成动态的网页内容。

典型的HTTP请求头例子如下:

1 Connection: keep-alive
2 Cache-Control: max-age=0
3 User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 QIHU 360EE
4 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5 Referer: http://www.adeploy.com/
6 Accept-Encoding: gzip,deflate,sdch
7 Accept-Language: zh-CN,zh;q=0.8
8 Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

\r\n表示换行。由此可以看到HTTP请求头是由几行“属性:值”对组成的,例如属性Accept的值为*/*\r\n ,表示客户端可以接受任意数据类型。

而我们最常用的是User-Agent字段和Referer字段,分别用于指定客户端类型和来源页面。

最末行额外多出的一对\r\n表示一个空白行,此空白行表示HTTP请求头结束,以下部分为请求正文。

3、HTTP请求正文

 HTTP请求正文经常为空,除非需要向服务端提交信息,如在使用POST向网站提交表单的时候。

例如如下是一个完整的HTTP请求的例子:

 1 GET / HTTP/1.1
 2 Host: www.adeploy.com
 3 Connection: keep-alive
 4 Cache-Control: max-age=0
 5 User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 QIHU 360EE
 6 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 7 Referer: http://www.adeploy.com/
 8 Accept-Encoding: gzip,deflate,sdch
 9 Accept-Language: zh-CN,zh;q=0.8
10 Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

二、HTTP响应

当收到HTTP请求之后,HTTP服务器会进行处理然后返回一个HTTP响应给客户端(典型的客户端为浏览器)。HTTP响应中包含几乎与HTTP请求同样类型的数据。

HTTP响应信息也由3部分组成:l 响应行(Response Status Line)l 响应头(Response Header)l 响应正文(Message Body)

响应行以服务端使用的HTTP协议版本号开始,后加响应状态码,表示请求结果状态,例如:

HTTP/1.1 200 OK

状态码200表示请求成功。

紧接着的是响应头。响应头与请求头十分相似,也是由几行“属性:值”对组成。其中包含关于服务器的有用信息、响应数据等。典型响应头如下:

1 Content-Type: text/html; charset=utf-8
2 Cache-Control: no-cache
3 Expires: Fri, 01 Jan 1990 00:00:00 GMT
4 Content-Encoding: gzip
5 Vary: Accept-Encoding
6 Date: Tue, 31 Jul 2012 07:20:31 GMT
7 Server: Google Frontend
8 Content-Length: 10387

如果请求成功,响应正文中将包含请求的数据,如图片文件的二进制数据、HTML文件等。一旦响应正文传输完毕,服务端又没有使用HTTP 1.1版本的Keep-Alive请求,HTTP连接将会断开。

三、Cookie

Cookie是服务器为了辨别用户身份、进行session跟踪用户识别,而储存在客户端的数据。用以判断在HTTP传输中的状态,从而弥补HTTP协议无状态的缺陷。

比如我们登录一个网站后,关闭网页后重新打开网页,服务端就可以通过cookie信息判断我们曾经登录过,从而跳过重新登录的过程,让用户感觉到亲切、方便、人性化。

当客户端向服务端发起请求时,浏览器会自动将cookie信息添加在HTTP请求头中。例子如下:

1 Cookie: __utmc=90639562; __utma=90639562.1273157993.1343361841.1343361841.1343718828.2; __utmb=90639562.1.10.1343718828; __utmz=90639562.1343361841.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)

在我们使用cURL时,每次访问网页都相当于浏览器打开关闭一次,因此cookie会起到很大的作用。

本篇介绍后续会使用的HTTP协议知识,只做简要概括,具体请参考RFC文档。

posted on 2014-04-04 18:09 禅茶自在 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/phptea/p/3645674.html

curl针对HTTP的相关使用方法相关推荐

  1. excel有关计算机问题,Excel的相关解决方法

    Excel打不开的常规解决办法 故障现象一:某一个Excel文档打不开,但能够打开Excel主程序,此excel文档是通过他人的电脑复制过来的 解决办法:打开一个正常的Excel文档,找到" ...

  2. 基于中文语义词典的语义相关度量方法比较研究

    摘要:词语语义相关度的计算,一种比较常用的方法是使用分类体系的语义词典,而国内外学者已经提出了多种基于语义相关的度量方法.这些方法对于词典和语言环境的依赖性是一个值得研究的问题.本文汇总了多种基于语义 ...

  3. java 加载dll后打包_让Jacob从当前路径读取dll文件及相关打包方法

    让Jacob从当前路径读取dll文件及相关打包方法 独立观察员2013.08.12 Jacob  LibraryLoader.class修改版代码 功能:让jacob可在当前路径下的dll文件夹内读取 ...

  4. 初步解读Golang中的接口相关编写方法

    初步解读Golang中的接口相关编写方法 概述如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口 ...

  5. 22 Python IO、打印到屏幕、读取键盘输入、打开和关闭文件、文件定位、重命名和删除文件、Python里的目录、文件,目录相关的方法

    22Python文件I/O 22.1打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下: ...

  6. [jQuery] 针对jQuery性能的优化方法有哪些?

    [jQuery] 针对jQuery性能的优化方法有哪些? show slide animate 等频繁修改 dom 很耗性能,可采用 jquery.transit 插件等使用单个 id 或 class ...

  7. 让Jacob从当前路径读取dll文件及相关打包方法

    让Jacob从当前路径读取dll文件及相关打包方法 独立观察员2013.08.12 Jacob  LibraryLoader.class  修改版代码 功能:让jacob可在当前路径下的dll文件夹内 ...

  8. 尚硅谷JS笔记-数组的剩余方法、函数的方法 、arguments 、Date、Math、包装类、字符串的相关方法、正则表达式、字符串和正则相关的方法的总结及归纳

    目录 一.数组的剩余方法 二.函数的方法 三.arguments 四.Date 五.Math 六.包装类 七.字符串的相关方法 八.正则表达式 九.正则表达式 十.字符串和正则相关的方法 一.数组的剩 ...

  9. php bearer token,php-使用CURL设置Bearer令牌的正确方法

    php-使用CURL设置Bearer令牌的正确方法 我从API端点获取了承载令牌,并设置了以下内容: $authorization = "Bearer 080042cad6356ad5dc0 ...

  10. Redis针对缓存击穿的解决方法-互斥锁

    参考至:Java岗大厂面试百日冲刺 - 日积月累,每日三题[Day2] -- Redis篇1_陈哈哈的菜园子-CSDN博客 缓存穿透:指缓存和数据库中都没有的数据,导致所有的请求都打到数据库上,然后数 ...

最新文章

  1. 028_CSS外边距
  2. html5常用的属性标签,HTML5常用标签及其属性设置
  3. 【数据挖掘】理解数据挖掘
  4. 顺丰固定翼无人机来了,未来你的快递将一路“飞”到你手中
  5. mplus 软件_Mplus 8.3 Combo Version 多元统计分析软件(Win)
  6. scala获得成员函数列表
  7. Spatial Transformer Networks(STN)
  8. c++ 读取访问权限冲突_Linux系统利用可执行文件的Capabilities实现权限提升
  9. 【Maven学习笔记(二)】Maven的安装与配置
  10. CodeIgniter中的FCKeditor的路径问题
  11. 基于内容的图像检索系统(合集)
  12. 如何才能写出“高质量”的代码?
  13. docker 容器安装 vim 编辑器
  14. 易语言网页html代码大全,易语言网页操作取网页源码
  15. 天天生鲜项目页面——商品列表页
  16. InVEST模型在固碳、生境质量、产水等领域案例分析
  17. 百度OCR图像识别(包含自定义模板)
  18. git squash 和 git rebase
  19. java如何改变图片大小_如何在Java中调整图片大小?
  20. 【快捷键】Mac KeyMap

热门文章

  1. opencv+Dlib python大眼代码
  2. MatConvNet 相关函数解释说明
  3. Automatic Tumor Segmentation from MRI scans 阅读笔记
  4. java.net cidr接口_CIDR - xiaohuazi - 博客园
  5. 2021-08-20 JSP JSTL标签
  6. c# mysql存储过程 输出参数值_C#获取存储过程返回值和输出参数值的方法
  7. sqlserver去重记录_SQL去除重复记录(七种)
  8. 加载中_Spring Boot 2.2 中的延迟加载
  9. 数据库学习笔记4-隔离级别 Read Committed
  10. kubernetes node节点join master 节点成功后, master节点无法发现node节点