使用PHP进行POST传递参数发送请求注意事项及案例
2019年9月15日
| 标签:
内容:
项目背景
有一个记账的网站,用来每天记录一些消费数据,这些数据其实是从支付宝后台下载后经过简单的整理
可以再输入到记账网站。
希望通过php脚本来实现填写表单的动作,完成对大量数据填写表单的自动处理
目前的问题:
运行环境问题,公司的电脑不能安装任何软件,所以无法安装php运行环境,需要找到一个绿色的php运行环境来执行php脚本
php具体代码问题,网站有的php脚本填写表单的例子都比较简单,这个涉及到的输入项目特别的多,并且一直出错没成功过
具体解决方案:
关于运行环境问题,我之前使用的quickphp 这个绿色软件,直接就可以运行,但是我发现他只能运行简单的post函数,关于curl比较高级的函数是不支持的,所以关于如何让quickphp能加上extention 这个思路大概研究了2个小时,期间尝试了下载dll文件,下载curl源文件,下载php.ini 最后均失败告终,然后调整思路,换一个绿色软件,最后找到了http://laragon.org 这个软件,它只有10M 但是可以运行apache php mysql所有环境 并且带有php许多库文件 支持高级函数库,可以替代quickphp,但是简单的程序我还是建议试试quickphp应该真的很小,就这样我解决了在公司不能安装程序的电脑上运行php环境 并且支持php高级函数的问题
接下来是解决实际脚本问题
首先分析网站 http://jz.u8see.com/account/ 在输入消费信息的时候 往服务器传递的是什么参数
因为涉及到cookie 所以也要把cookie值给复制下
然后就网上找到了对应的脚本
从chrome的分析工具可以看到 浏览器发出请求给http://jz.u8see.com/myaccount/expense/new/
并且使用的是POST方法
请求的头包含了很多信息,以及cooki值,并且表单信息也包含了很多
$url=”http://jz.u8see.com/myaccount/expense/new/”;
$url_cookie=’yourcookie’;
$headers = array();
$headers[] = ‘Content-Type: application/x-www-form-urlencoded’;
$post_data1 = array(
“date” =>’2020-04-01’,
“feetitle” => ‘xiangmu3’,
“feenum” => 122,
“feekindname” => ‘饮食’,
“feekind” => 1
);
$post_data1= http_build_query($post_data1);
$ch =curl_init();
//set post and header data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_COOKIE,$url_cookie);
//curl_setopt($ch,CURLOPT_POST,true);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data1); //$data是每个接口的json字符串
//set post and header data
$content = curl_exec($ch);
以上是完整正确的代码
这里要说的是容易出错的地方也是花了4个多小时才明白的地方
第一点,post参数需要是字符串不能是数组
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data1)
这个函数的变量参数需要是字符串,不能是数组,所以我们如果是有数组需要使用
$post_data1= http_build_query($post_data1);
这个函数对数组进行urlencode编码
第2点在post的数组中直接使用中文,http_build_query能处理中文,不要使用已经encode的中文编码
这个问题比较隐蔽, 我之前在数组里面写 “feekindname” => ‘饮食’, 使用的是 “feekindname” => ‘%E9%A5%AE%E9%A3%9F’,
但是经过http_build_query函数后%这个字符会变成%25 然后整个参数就不再是饮食, 儿饮食这个参数是系统设定好的,你传回去不是这个值 就一定会出错,这个问题是我对所有字符串进行1 1比对才知道的
方法就是 复制下来chrome里面传递的所有的参数的 urlencode形式,然后再使用http_build_query对我们的参数进行编码
最后才知道这个坑
第3个问题就是因为我有2个账户进行测试,在a账户的cookie信息传递b账户的分类名称是不正确的, 因为我a账户可能不存在这个b账户的分类名,这个问题也是后来自己想通的, 所以还是需要对所有参数进行一一比对才知道问题
最后终结下 走过的弯路
使用php的curl进行post,变量需要是字符串,不能是数组,数组使用http_build_query变化,数组里面有中文的不要自作聪明先encode
项目背景
有一个记账的网站,用来每天记录一些消费数据,这些数据其实是从支付宝后台下载后经过简单的整理
可以再输入到记账网站。
希望通过php脚本来实现填写表单的动作,完成对大量数据填写表单的自动处理
目前的问题:
运行环境问题,公司的电脑不能安装任何软件,所以无法安装php运行环境,需要找到一个绿色的php运行环境来执行php脚本
php具体代码问题,网站有的php脚本填写表单的例子都比较简单,这个涉及到的输入项目特别的多,并且一直出错没成功过
具体解决方案:
关于运行环境问题,我之前使用的quickphp 这个绿色软件,直接就可以运行,但是我发现他只能运行简单的post函数,关于curl比较高级的函数是不支持的,所以关于如何让quickphp能加上extention 这个思路大概研究了2个小时,期间尝试了下载dll文件,下载curl源文件,下载php.ini 最后均失败告终,然后调整思路,换一个绿色软件,最后找到了http://laragon.org 这个软件,它只有10M 但是可以运行apache php mysql所有环境 并且带有php许多库文件 支持高级函数库,可以替代quickphp,但是简单的程序我还是建议试试quickphp应该真的很小,就这样我解决了在公司不能安装程序的电脑上运行php环境 并且支持php高级函数的问题
接下来是解决实际脚本问题
首先分析网站 http://jz.u8see.com/account/ 在输入消费信息的时候 往服务器传递的是什么参数
因为涉及到cookie 所以也要把cookie值给复制下
然后就网上找到了对应的脚本
从chrome的分析工具可以看到 浏览器发出请求给http://jz.u8see.com/myaccount/expense/new/
并且使用的是POST方法
请求的头包含了很多信息,以及cooki值,并且表单信息也包含了很多
$url=”http://jz.u8see.com/myaccount/expense/new/”;
$url_cookie=’yourcookie’;
$headers = array();
$headers[] = ‘Content-Type: application/x-www-form-urlencoded’;
$post_data1 = array(
“date” =>’2020-04-01’,
“feetitle” => ‘xiangmu3’,
“feenum” => 122,
“feekindname” => ‘饮食’,
“feekind” => 1
);
$post_data1= http_build_query($post_data1);
$ch =curl_init();
//set post and header data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_COOKIE,$url_cookie);
//curl_setopt($ch,CURLOPT_POST,true);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data1); //$data是每个接口的json字符串
//set post and header data
$content = curl_exec($ch);
以上是完整正确的代码
这里要说的是容易出错的地方也是花了4个多小时才明白的地方
第一点,post参数需要是字符串不能是数组
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data1)
这个函数的变量参数需要是字符串,不能是数组,所以我们如果是有数组需要使用
$post_data1= http_build_query($post_data1);
这个函数对数组进行urlencode编码
第2点在post的数组中直接使用中文,http_build_query能处理中文,不要使用已经encode的中文编码
这个问题比较隐蔽, 我之前在数组里面写 “feekindname” => ‘饮食’, 使用的是 “feekindname” => ‘%E9%A5%AE%E9%A3%9F’,
但是经过http_build_query函数后%这个字符会变成%25 然后整个参数就不再是饮食, 儿饮食这个参数是系统设定好的,你传回去不是这个值 就一定会出错,这个问题是我对所有字符串进行1 1比对才知道的
方法就是 复制下来chrome里面传递的所有的参数的 urlencode形式,然后再使用http_build_query对我们的参数进行编码
最后才知道这个坑
第3个问题就是因为我有2个账户进行测试,在a账户的cookie信息传递b账户的分类名称是不正确的, 因为我a账户可能不存在这个b账户的分类名,这个问题也是后来自己想通的, 所以还是需要对所有参数进行一一比对才知道问题
最后终结下 走过的弯路
使用php的curl进行post,变量需要是字符串,不能是数组,数组使用http_build_query变化,数组里面有中文的不要自作聪明先encode
发表评论
| Trackback