如何导出Perl中WWW::Curl::Easy对象即将发送的完整实际请求
解决方案
你可以通过libcurl内置的调试回调能力拿到完整的真实请求内容,Dumper导出$curl对象看不到有效信息是因为该对象封装的是libcurl的内部C结构,Perl层面无法直接遍历读取配置和待发送的内容。
方法1:使用CURLOPT_DEBUGFUNCTION捕获完整请求(推荐)
该方法可以精准获取你需要的请求头、请求方法、请求体、POST数据所有内容,你可以选择打印日志或者存到变量中,示例修改代码如下:
use WWW::Curl::Easy; use Data::Dumper; my $curl = WWW::Curl::Easy->new(); $curl->setopt(CURLOPT_POST, 1); $curl->setopt(CURLOPT_HEADER, 1); $curl->setopt(CURLOPT_HTTPHEADER, ['Accept: text/xml; charset=utf-8', 'Content-Type:text/xml; charset=utf-8', 'SOAPAction: "importSheet"']); $curl->setopt(CURLOPT_POSTFIELDS, $requestMessage); $curl->setopt(CURLOPT_URL, $tom::{'setup'}{'api'}{'carrier'}{'url'}); my $response; $curl->setopt(CURLOPT_WRITEDATA, \$response); # 新增调试配置开始 my $full_request = ''; $curl->setopt(CURLOPT_VERBOSE, 1); $curl->setopt(CURLOPT_DEBUGFUNCTION, sub { my ($easy, $type, $data, $len) = @_; # 回调类型说明:0=通用调试文本 1=响应头 2=响应体 3=请求头 4=请求体 if ($type == 3 || $type == 4) { $full_request .= $data; } return 0; }); # 新增调试配置结束 my $ret = $curl->perform(); # 执行完之后就可以打印或记录完整请求了 main::_log("完整请求内容:\n" . $full_request);
方法2:临时快速调试
如果只是临时排查问题,不需要存储请求内容,只需要加一行配置即可:
$curl->setopt(CURLOPT_VERBOSE, 1);
执行perform时会自动把所有请求、响应的调试信息输出到标准错误流,你可以直接查看或者重定向到日志文件。
内容的提问来源于stack exchange,提问作者tomsk
相关产品推荐
相关产品推荐

