php使用curl 实现GET和POST请求(抓取网页,上传文件),支持跨项目和跨服务器...

 

一:curl 函数和参数详解

函数库:
1:curl_init 初始化一个curl会话
2:curl_close 关闭一个curl会话
3:curl_setopt 为一个curl设置会话参数
4:curl_error 返回一个包含当前会话错误信息的字符串
5:curl_exec 执行一个curl会话
6:curl_multi_add_handle 向curl批处理会话中添加单独的curl句柄资源
7:curl_multi_close 关闭一个批处理句柄资源
8:curl_multi_exec 解析一个curl批处理句柄
9:curl_multi_getcontent 返回获取的输出的文本流
10:curl_multi_info_read 获取当前解析的curl的相关传输信息
11:curl_multi_init 初始化一个curl批处理句柄资源
12:curl_multi_remove_handle 移除curl批处理句柄资源中的某个句柄资源
13:curl_multi_select 阻塞直到cURL批处理连接中有活动连接
14:curl_setopt_array 以数组的形式为一个curl设置会话参数
15:curl_version 获取curl相关的版本信息
16:curl_getinfo 获取一个curl连接资源句柄的信息
17:curl_copy_handle 拷贝一个curl连接资源的所有内容和参数
18:curl_errno 返回一个包含当前会话错误信息的数字编号

curl_setopt常用可设置参数:
CURLOPT_URL 请求的url地址
CURLOPT_RETURNTRANSFER 设置是否获取数据返回,数据以文件流的形式返回,不是直接输出
CURLOPT_POST 设置是否POST请求,类型为:application/x-www-form-urlencoded,跟表单提交一样
CURLOPT_POSTFIELDS POST请求的数据
CURLOPT_HEADER 启用时会将头文件的信息作为数据流输出
CURLOPT_HTTPGET 启用时会设置HTTP的method为GET,默认是GET

二:curl GET 方式

1
2
3
4
5
6
7
8
$ch curl_init();//设置选项参数curl_setopt($ch, CURLOPT_URL"http://baidu.com");curl_setopt($ch, CURLOPT_RETURNTRANSFER1);//设置返回数据curl_setopt($ch, CURLOPT_HEADER0);//设置头部不执行$output curl_exec($ch);//执行curl_close($ch);//释放curl句柄var_dump($output);

三:POST 方式

1
2
3
4
5
6
7
8
9
10
$url "http://localhost/ceshi.php";$post_data array ("username" =&gt"ceshi","pwd" =&gt"sada&1dsw1","key"=>"ha");$ch curl_init();//初始化curlcurl_setopt($ch, CURLOPT_URL$url);//设置请求地址curl_setopt($ch, CURLOPT_RETURNTRANSFER1);//返回值curl_setopt($ch, CURLOPT_POST1);//设置请求方式POSTcurl_setopt($ch, CURLOPT_POSTFIELDS$post_data);//请求所带变量数据$output curl_exec($ch);//执行获取返回数据,返回的数据建议json_encode($return_data);curl_close($ch);$output =json_decode($output );//解析返回数据

四:curl POST 方式上传文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$post_data=array("Filedata"=>"@".$image_file);//利用数组传值,image_file为图片地址,@不能少,标明是一个文件$url "http://localhost/ceshi.php";$ch curl_init()//初始化curlcurl_setopt($ch, CURLOPT_URL$url);//设置链接curl_setopt($ch, CURLOPT_RETURNTRANSFERtrue);//设置是否返回信息curl_setopt($ch, CURLOPT_POSTtrue);//设置为POST方式curl_setopt($ch, CURLOPT_POSTFIELDS$post_data);//POST数据$result curl_exec($ch);//接收返回信息if(curl_errno($ch)){//出错则显示错误信息die(json_encode($ch));}curl_close($ch)//关闭curl链接if (ord($result[0])==239&&ord($result[1])==187&&ord($result[2])== 191){$result substr$result,3);//解决Bom头带来的json_decode为空的bug,Bom头是固定的,可以检测后去除掉}$result=json_decode($result);

五:curl POST 文件上传常见问题和解决办法:

1:curl_setopt设置CURLOPT_POSTFIELDS 传值是个数组,后端一直无法获取数据$_POST的值

错误现象:
如果$post_data是数组(包括多维数组)的话会出现”entity is too large”的错误提示,接收数据的receive.php 无法获取curl传过来的数据

原因:
curl POST方法时候,传递一个数组到CURLOPT_POSTFIELDS,curl会把数据编码成 multipart/form-data,如果传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded,对于multipart/form-data的编码方式其实相当于我们直接以”enctype=”multipart/form-data” method=”post” 这样的表单进行操作

解决办法:
a:
对$post_data 数组经 urlencode() 编码后进行字符串连接,
例:$post_data=”&name=urlencode($name)&pwd=usrlencode($pwd)”

b:
直接利用http_build_query()进行参数的拼接。

ps:
“multipart/form-data” 是把表单设置为MIME编码,目的是用来传输二进制文件的,若想上传文件,必须用这个编码(例子见上面的curl POST上传文件的例子);但是普通的url数据使用的是“application/x-www-form-urlencoded” 格式。

2:curl请求返回数据头部多了三个字节,post请求后端是以json_encode 数据格式返回,进行json_decode后返回值始终为空

原因:bom头搞的鬼,bom头:在Windows下用记事本之类的程序将文本文件保存为UTF-8格式时,记事本会在文件头前面加上几个不可见的字符(EF BB BF),就是所谓的BOM(Byte order Mark),就是这前面多了三个字节导致json_decode后返回值为空
对返回值进行bom头检测检测:

1
2
3
4
echo substr$result0)//看到一个乱码echo substr$result0)//看到两个乱码echo substr$result0)//空白echo substr$result0)//看到o

证明确实是bom头的问题

解决办法:

1
2
3
if ord$result[0== 239 &&ampord$result[1== 187&&ampord$result[2== 191 {$result substr$result);//Bom头是固定的,可以检测后去除掉}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微笑点燃希望

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值