您的位置:首页 >> WEB开发 >> PHP CURL一记小坑

PHP CURL一记小坑

[ 孤狼 | 2021-11-05 17:48:46 | WEB开发 | 145°C | 0条评论 ]

最近在开发自己的RSS,自己写了CURL的请求去采集一些关注的站点,大部分的站点采集都没有问题,部分需要JS更新的站点尝试使用QueryList采集也可以成功,但是当采集蓝奏网盘的时候出现了一个奇怪的问题,提交过token之后,无法获取到数据。尝试使用了postman等工具测试之后又没有问题,于是开始了一次趟坑之旅。


使用CURL来请求接口问题,获取蓝奏的主页也没有问题。由于蓝奏采用的是JS刷新机制,所以直接采集到的内容是没有列表信息的。只能通过拼接token的方式来请求蓝奏的列表接口获取列表信息。但是postman请求没有问题,PHP CURL请求回来的一直是失败。数据对比后也没有问题,更换了header头信息也是失败。多次测试之后删除了很多CURL的参数之后有几次成功了,于是猜测应该是CURL的一些参数配置问题。


参照了很多案例之后发现了一个问题。长期以来都是自己用CURL来请求自己的项目接口,PHP的宽容度太高,很多参数都自动处理了,所以一直没有问题,但是蓝奏的接口很严格,从而导致了接收参数失败。


CURL中的 CURLOPT_POSTFIELDS 参数一直以来都是直接传个数组参数提交,php可以直接处理内容,但是蓝奏需要严格的键值对的方式提交,于是需要一次转换,将数组格式转换为键值对格式提交。数组需要使用http_build_query()方法处理一次提交才能成功。



http_build_query()


http_build_query()函数的作用是使用给出的关联(或下标)数组生成一个经过URL-encode处理的请求字符串。

$data['name']='admin';
$data['pass']='123';
$data['unick']='老王';
$data['age']='15';

$_data=http_build_query($data);

var_dump($_data);

//string(51) "name=admin&pass=123&unick=%E8%80%81%E7%8E%8B&age=15"

可以看到,这个格式其实就是在使用postman提交的时候用的数据拼接的方式,同时如果内容有中文的话,也会经过转码。


所以以后如果需要向其他系统接口提交数据的时候,可以直接使用转码,php能自动处理,其他的语言或要求严格的接口也能直接接收。

转载请注明出处:http://gl.paea.cn/n.php?n=159
 
如您看得高兴,欢迎随意投喂,让我们坚持创作!
赞赏一个鸡腿
还没有人留下遗迹
综合 · 搜索