用php curl请求接口碰到的问题总结
admin
2023-06-12 18:42:17
0

用php curl请求接口碰到的问题

今天碰到个用php扩展curl类库命令实现linux curl的情况,碰到了一些小问题,总结总结。


场景

向资源方请求实现某种功能。相关同学给出了例子:

curl -v -XPOST -u username:abcpass\; -H "Content-Type: application/json"  \
--data '{"sv":"ddcd"}' 'http://api.test.com/alert'

先找框架里面封装好的类库进行请求,发现无法满足需求。后来还是直接到php的curl扩展请求吧。

使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤:

  • 初始化连接句柄(curl_init);
  • 设置CURL选项(curl_setopt);
  • 执行并获取结果(curl_exec);
  • 释放CURL连接句柄(curl_close)。

相关例子如下:

// 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');

那么我们传递参数如下:

$mailInfo = [
     'sv' => 'ddcd'
];
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($mailInfo));

Authorization

我们还碰到了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的错误。好了正确的代码如下了。

    $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);

好了,终于出来了。其他参数默认了,总结下,继续吧。

相关内容

热门资讯

半岛电视台:美伊就资产解冻问题... 新华社多哈5月25日电(记者汪强)卡塔尔半岛电视台25日报道,一名了解伊朗高级代表团在多哈会谈情况的...
多地积极探索算电协同创新模式 本报记者 李万晨曦 近日,南方电网广西电网公司联合中国移动广西公司开展了首次算电协同响应实景测试,成...
乘舟向天宫 逐梦揽星河——神舟... 乘舟向天宫  逐梦揽星河 ——神舟二十三号载人飞行任务乘组出征侧记 ■杨子凡 解放军报记者 赵 倩 ...
基恩士相机无图像维修服务商梳理... 导语:在工业自动化设备运维中,基恩士相机作为视觉检测的核心部件,其稳定性直接影响生产线效率。针对无图...
新型3D打印技术问世 机构高频... 新型3D打印技术问世机构高频调研3只概念股 人民财讯5月25日电,2026年以来,3D打印行业内好消...
DeepSeek V4永久降价... 快科技5月25日消息,DeepSeek近日更新API文档,宣布DeepSeek-V4-Pro模型在5...
俄外长告知美方对乌打击计划 新华社莫斯科5月25日电(记者侯鸣)俄罗斯外交部网站25日发布通告说,俄外交部长拉夫罗夫当天同美国国...
伊朗总统下令:恢复互联网至今年... △资料图当地时间25日晚,伊朗总统佩泽希齐扬下令恢复伊朗互联网至今年1月大规模断网前的状态。(总台记...
国家两部门:开展矿山机器人应用... 国家矿山安全监察局综合司 工业和信息化部办公厅关于开展矿山机器人应用验证试点工作的通知 国家矿山安全...
打造“终身学习之城”,杭州积极... 潮新闻客户端 记者 徐婷 俞刘东 通讯员 许慧敏 人工智能时代日新月异,培养适应时代生存发展的人才,...