PHP中的cURL请求及示例学习笔记

备注:使用curl_init函数,必须要打开这个php扩展。

1.打开php.ini,开启extension=php_curl.dll
2.检查php.ini的extension_dir值是哪个目录,检查有无php_curl.dll,没有的请下载php_curl.dll,再把php目录中的libeay32.dll,ssleay32.dll拷到c:/windows/system32里面。

最近在学习腾讯开放平台API接口的过程中,看到了一个很强大的PHP库——cURL。它是利用URL语法在命令行方式下工作的文件传输工具。这篇文章是博主直接从国外一个博客翻译过来的,原文地址是:http://codular.com/curl-with-php。这篇文章讲的很基础,但条理很清晰,知识比较系统和全面,所以转过来收藏了!(下面的有些标题是博主画蛇添足的,大家近乎可以忽略。)
1 定义:什么是cURL

cURL允许数据传输跨广泛的协议,是一个非常强大的系统。它广泛用于跨网站发送数据,包括诸如API交互和oAuth。cURL是在它的应用范围内几乎是无所不能的,从基本的HTTP请求,到更为复杂的FTP上传或封闭式HTTPS网站的交互验证。让我们一起来看看发送一个GET和POST请求和处理返回的响应的简单区别,以及一些重要的参数说明。

在我们通过一个cURL请求做任何事之前,我们首先需要初始化一个cURL的实例。我们可以通过调用函数curl_init()函数实现,它会返回一个cURL资源。该函数接收你想要发送的请求URL作为它的一个参数。在本文中,我们先不做这一步,可以在接下来的过程中用另一种方式来实现它。
2 须知:一些核心设置

一旦我们得到了一个cURL资源,我们可以开始进行一些配置,下面列出我总结的一些核心设置。

    CURLOPT_RETURNTRANSFER - 返回响应作为一个字符串,而不是输出到屏幕
    CURLOPT_CONNECTTIMEOUT - 连接超时的时间
    CURLOPT_TIMEOUT - cURL执行的超时时间
    CURLOPT_USERAGENT - 用于请求的Useragent字符串
    CURLOPT_URL - 发送请求的URL对象
    CURLOPT_POST - 以POST方式发送一个请求
    CURLOPT_POSTFIELDS - 在POST提交的请求中的数组数据

3 创建一个配置

我们可以通过使用curl_setopt()方式创建一个配置,这个方式接受3个参数:cURL资源、设置以及设置对应的值。因此,我们可以如下所示设置我们正在发送的请求URL。

 代码如下 复制代码

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'http://www.111cn.net');

如上所示,当获取cURL资源时,我们可以通过传送一个参数来设置URL。

 代码如下 复制代码

    $curl = curl_init('http://www.111cn.net');

当然我们也可以通过给curl_setopt_array()函数传递一个包含变量名和变量值的数组一次性地创建多重配置。

 代码如下 复制代码

    $curl = curl_init();
    curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://www.111cn.net'
    ));

4 执行请求:curl_exec()

当所有选项都配置好后,准备发送请求时,我们可以通过调用curl_exec()方式来执行这个cURL请求。这个函数将会返回三种不同的情形:

 代码如下 复制代码

    $result = curl_exec($curl);

此时,$result已经包含了页面的响应——它可能是JSON,一个字符串或者一个完整的网站的HTML。
5 关闭请求:curl_close()

当你发送完一个请求并且获取到了相应的返回结果,你就需要关闭这个cURL请求以便释放一些系统资源。通过调用curl_close()方法,我们可以像其它所有需要将资源作为参数的函数一样简单实现资源的释放。
6 GET请求

GET请求是默认的请求方法,并且我们可以很直截了当的使用它。事实上所有的例子到目前为止一直都是GET请求。如果你想在请求中加入传入一些参数,那么你可以像http://testcURL.com/?item1=value&item2=value2一样把这些参数作为一个查询字符串附加在URL地址后面。

因此,我们可以通过如下示例发送一个GET请求到上面的URL中去,并且返回相应的结果。

 代码如下 复制代码

    // Get cURL resource
    $curl = curl_init();
    // Set some options - we are passing in a useragent too here
    curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://testcURL.com/?item1=value&item2=value2',
    CURLOPT_USERAGENT => 'Codular Sample cURL Request'
    ));
    // Send the request & save response to $resp
    $resp = curl_exec($curl);
    // Close request to clear up some resources
    curl_close($curl);

7 POST请求

GET请求和POST请求两者之间语法的唯一区别就是:在你想要传送一些数据时,多了一个设置。我们将把CURLOPT_POST设置为true,并且通过设置CURLOPT_POSTFIELDS来传送包含一个数组的数据。

因此,如果把上面的GET请求转换为POST请求,我们可以使用下面的代码:

 代码如下 复制代码

    // Get cURL resource
    $curl = curl_init();
    // Set some options - we are passing in a useragent too here
    curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://www.111cn.net',
    CURLOPT_USERAGENT => 'Codular Sample cURL Request',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => array(
    item1 => 'value',
    item2 => 'value2'
    )
    ));
    // Send the request & save response to $resp
    $resp = curl_exec($curl);
    // Close request to clear up some resources
    curl_close($curl);

到这里,你就拥有了这样的一个POST请求:它将产生和上面GET请求一样的效果,并且把返回数据到脚本中,这样你就可以随便使用它们了。

发起https请求示例

 代码如下 复制代码

function _https_curl_post($url, $vars) 

    foreach($vars as $key=>$value)
    {
        $fields_string .= $key.'='.$value.'&' ;
    } 
    $fields_string = substr($fields_string,0,(strlen($fields_string)-1)) ;
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  2);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  // this line makes it work under https
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POST, count($vars) );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);     
    $data = curl_exec($ch);        
    curl_close($ch);  
       
    if ($data)
    {
        return $data;
    }
    else
    {
        return false;
    }
}

8 错误

尽管我们讨厌错误,但是你还是得注意使用cURL时可能出现的情形。因为你最终无法控制你所发送请求的网站,也无法保证该站点的响应结果将会是你预想的那种方式以及这个站点一直都会是正常状态。

这里提供了两个可以用来处理错误的函数:

    curl_error() - 返回一个字符串错误信息(当请求正常返回时,其值为空)
    curl_errno() - 返回cURL的错误数目,然后你可以查看这个包含错误代码的页面。

例如,你可以如下示例使用:

 代码如下 复制代码

    if(!curl_exec($curl)){
    die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
    }

如果你想要任何HTTP响应代码都大于400来产生一个错误,而不是返回整个HTML页面,那么你可以把CURLOPT_FAILONERROR设置为true。cURL是一个“庞然大物”,并且还有很多很多的可能。有些网站可能为一些用户代理提供服务页面,当使用API接口时,它们可能会要求你传送一个特别的用户代理,这些都是我们需要注意的。如果你还想了解一些cURL请求,为何不尝试去oAuth with Instagram看看呢?

时间: 2024-10-27 18:35:46

PHP中的cURL请求及示例学习笔记的相关文章

JQuery中attr属性和jQuery.data()学习笔记【必看】_jquery

用html直接data-key来存放,key必须全部小写. <div data-mydata="123"></div> consoloe.log($("div").data("mydata")); //output 123 二避免在key中使用短横线 <a id="bar" data-foo-bar-baz="fizz-buzz" href="#">f

jquery中formValidator表单验证插件学习笔记

jQuery formValidator表单验证插件是一款客户端表单验证插件.第一次接触jQuery formValidator是学习phpcms的时候,因为其在表单验证方面功能强大,且使用简单,所以我在做网站开发时常常用到.在WBlog中涉及到写入数据时总是少不了jQuery formValidator的验证.这里主要介绍jQuery formValidator使用方法. 下面我就用WBlog安装包install.php的例子来说明jQuery formValidator的使用方法. 一.加载

jQuery Ajax示例学习笔记

使用 jQuery 将使 Ajax 变得及其简单.jQuery 提供有一些函数,可以使简单的工作变得更加简单,复杂的工作变得不再复杂. Ajax 最常见的用法就是把一块 HTML 代码加载到页面的某个区域中去.为此,只需简单地选择所需的元素,然后使用 load() 函数即可.下面是一个用于更新统计信息的示例:  代码如下 复制代码 $('#stats').load('stats.html'); 通常,我们只需简单地把一些参数传递给服务器中的某个页面.正如您所预料的,使用 jQuery 实现这一操

Swift中内置的集合类型学习笔记_Swift

一.引言 Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型.Array用于存放一组有序的数据,数据角标从0开始一次递增:Set用于存放一组无序的数据,数据不可以重复:Dictionary也用于存放一组无序的数据,只是其是按照键值对的方式存储,键值必须唯一.这里借用官方文档中的一张图来表示3种集合类型的特点: 二.Array类型 Array通常也被称为数组,Swift是一种类型安全语言,其中的Array类型也必须确定其元素的类型,声明数组类型有两种方

Lua中的元表和元方法学习笔记_Lua

元表(metatable)是 Lua 里每种类型的值的默认操作方式的集合,例如,数字可以加减乘除.字符串可以连接合并.table 可以插入一对 key-value 值.函数可以被调用等等,这些操作都遵循其预定义的行为来执行. 而值的默认操作方式不是一成不变的,可以通过元表来修改其行为表现,或者是新定义一些默认没有的操作.例如,当两个 table 相加时, Lua 会检查它们之间的元表里是否有 "__add" 这个函数,如果定义有这个函数, 则调用这个函数来执行一次加法操作. 这里,相加

linux中Cent OS SVN 服务配置学习笔记

最近研究了下在Cent OS上配置SVN服务及版本库权限设置,下面是我的配置笔记 #安装SVN yum -y install subversion #测试SVN是否已经安装好 svn #创建svn版本库文件夹 mkdir /var/local/svn/ # 编辑自系统启动文件 vi /etc/rc.local 把光标用方向键移动到一个空行 按i输入下面语句 (如果有没有空行,把光标放在任意行按o) svnserve -d -r /var/local/svn/ 按esc,再输入:wq保存退出 启动

Swift学习笔记(3)iOS 9 中的网络请求

Swift学习笔记(3)iOS 9 中的网络请求 目录 Swift学习笔记3iOS 9 中的网络请求 目录 编码方法 请求方法 其他修改 完整代码 运行结果 编码方法 在iOS9中,以前常用的stringByAddingPercentEscapesUsingEncoding方法被废除了,取而代之的是stringByAddingPercentEncodingWithAllowedCharacters方法. 用法示例: var strURL=String(format:"http://blog.cs

java对象序列化学习笔记

java对象|笔记 目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少.本人把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家.希望能为整个java社区的繁荣做一点事情.    序列化的过程就是对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机.对象序列化功能非常简单.强大,在RMI.Socket.JMS.EJB都有应用.对象序列化问题在网

MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

[正文] 首先需要回顾一下上一篇文章中的内容:MySQL数据库学习笔记(八)----JDBC入门及简单增删改数据库的操作 一.ResultSet接口的介绍: 对数据库的查询操作,一般需要返回查询结果,在程序中,JDBC为我们提供了ResultSet接口来专门处理查询结果集. Statement通过以下方法执行一个查询操作: ResultSet executeQuery(String sql) throws SQLException  单词Query就是查询的意思.函数的返回类型是ResultSe