今天碰到个用php扩展curl类库命令实现linux curl的状况,碰到了一些小问题,总结总结。php
向资源方请求实现某种功能。相关同窗给出了例子:linux
curl -v -XPOST -u username:abcpass\; -H "Content-Type: application/json" \ --data '{"sv":"ddcd"}' 'http://api.test.com/alert'
先找框架里面封装好的类库进行请求,发现没法知足需求。后来仍是直接到php的curl扩展请求吧。shell
使用CURL的PHP扩展完成一个HTTP请求的发送通常有如下几个步骤:json
相关例子以下:api
// 1. 初始化 $ch = curl_init(); // 2. 设置选项,包括URL curl_setopt($ch,CURLOPT_URL,"http://api.test.com/alertr"); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,0); // 3. 执行并获取HTML文档内容 $output = curl_exec($ch); if($output === FALSE ){ echo "CURL Error:".curl_error($ch); } // 4. 释放curl句柄 curl_close($ch);
参考上面的curl例子,咱们还要加入POST方法和经过POSTFIELDS传递内容。网上给出的例子以下:数组
参数 | 描述 |
---|---|
CURLOPT_POST | TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最多见的一种。 |
CURLOPT_POSTFIELDS | 所有数据使用HTTP协议中的 "POST" 操做来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ';type=mimetype' 的格式指定。 这个参数能够是 urlencoded 后的字符串,相似'para1=val1¶2=val2&...',也可使用一个以字段名为键值,字段数据为值的数组。 若是value是一个数组,Content-Type头将会被设置成multipart/form-data。 从 PHP 5.2.0 开始,使用 @ 前缀传递文件时,value 必须是个数组。 从 PHP 5.5.0 开始, @ 前缀已被废弃,文件可经过 CURLFile 发送。 设置 CURLOPT_SAFE_UPLOAD 为 TRUE 可禁用 @ 前缀发送文件,以增长安全性。 |
也有说直接CURLOPT_POSTFIELDS 这个字段传递一个json字符串的,这个得看具体server端取得参数形式。若是是标准的post参数形式能够参照上述table中的内容。而后,咱们的兄弟部门使用的以下方式得到参数:安全
$data = file_get_contents('php://input');
那么咱们传递参数以下:app
$mailInfo = [ 'sv' => 'ddcd' ]; curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($mailInfo));
咱们还碰到了Authorization的问题, 查询文档发现下面两个参数能够用:CURLOPT_USERNAME和CURLOPT_USERPWD。
因而我用了以下参数:框架
参数 | 描述 | 限制说明 |
---|---|---|
CURLOPT_USERNAME | 验证中使用的用户名。 | cURL 7.19.1 中添加,PHP 5.5.0 起有效。 |
CURLOPT_USERPWD | 传递一个链接中须要的用户名和密码,格式为:"[username]:[password]"。 | |
CURLOPT_HTTPAUTH | 。。。 | 这里用了CURLAUTH_BASIC这个值 |
在这里我碰到了一个坑,一直认为密码是abcpass,忽略了后面的\;符号 ,其实\;也是密码的一部分,而反斜杠\是;的转译格式
。实际代码里面写的password应该是abcpass; 这个密码,这个简单的问题折腾了我半天。一直报401的错误。好了正确的代码以下了。curl
$mailInfo = [ 'sv' => 'ddcd' ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ; curl_setopt($ch, CURLOPT_USERPWD, "username:abcpass;"); curl_setopt($ch, CURLOPT_URL, 'http://api.test.com/alert'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERNAME, 'username'); // 这里还有优化空间 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($mailInfo)); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_HEADER, 1); $re = curl_exec($ch); curl_close($ch);
好了,终于出来了。其余参数默认了,总结下,继续吧。