如何用Perl向PHP接口异步发送JSON数据并获取HTTP响应码
如何用Perl向PHP接口异步发送JSON数据并获取HTTP响应码
看起来你已经找对路子啦!用AnyEvent和AnyEvent::HTTP来实现异步HTTP请求完全契合你的需求——不用等PHP后端处理完业务逻辑,只要拿到HTTP响应码就行。我帮你把截断的代码补全,再给你唠唠关键细节:
完整实现代码
首先是补全后的sendOutboundPostRequestAsync函数,还加了调用示例,你直接就能用:
#!/usr/bin/perl use strict; use warnings; use JSON qw(encode_json); use AnyEvent; use AnyEvent::HTTP; =pod Function send asynchronous data, get response code =cut sub sendOutboundPostRequestAsync { my ($url, $data, $token) = @_; # 条件变量:用来异步等待请求拿到响应码(不用等后端业务处理完) my $request_done = AnyEvent->condvar; # 把哈希数据转成JSON字符串 my $json_data = encode_json($data); print "JSON data being sent: $json_data\n"; # 调试用,上线可以注释掉 # 发起异步POST请求 http_post $url, $json_data, # 这里你之前漏了请求体参数,可不能少 headers => { 'Authorization' => $token, # 注意如果是Bearer token,要确保$token带"Bearer "前缀 'Content-Type' => 'application/json', 'Content-Length' => length($json_data), # 可选,但加上更规范 }, sub { my ($body, $res) = @_; # 拿到HTTP响应码,这就是你要的核心结果 my $status_code = $res->{Status}; print "Received HTTP status code: $status_code\n"; # 这里可以加自定义的状态码判断逻辑 if ($status_code =~ /^2\d\d/) { print "请求发送成功,服务器已接收\n"; } else { print "请求可能有问题,状态码:$status_code\n"; # 比如这里可以加日志记录、重试逻辑啥的 } # 通知条件变量:我们已经拿到响应码,不用继续等了 $request_done->send; }; # 等待拿到响应码后再继续(短期脚本必须加;长期运行的服务可根据情况调整) $request_done->recv; } # -------------------------- # 调用示例 # -------------------------- my $test_url = "http://your-domain.com/test.php"; my $post_data = { username => "test_user", action => "sync_data", payload => { id => 123, content => "hello world" } }; my $auth_token = "Bearer your-real-token-here"; # 假设是Bearer认证格式 # 调用异步发送函数 sendOutboundPostRequestAsync($test_url, $post_data, $auth_token); print "脚本继续执行其他任务,不用等PHP处理完业务逻辑\n";
关键细节唠一唠
异步的核心逻辑
咱用AnyEvent->condvar创建了一个条件变量,它的作用就是帮咱“等”到响应码拿到手,同时不阻塞脚本的其他操作。只要回调里拿到了状态码,就调用$request_done->send告诉条件变量“活儿干完了”,脚本就能继续跑别的任务。如何快速拿到响应码
HTTP响应码是在响应头里返回的,所以只要服务器接收到请求并返回了响应头,咱就能通过$res->{Status}拿到它——完全不需要等PHP后端处理完业务逻辑,这正好符合你的需求!几个容易踩坑的点
- 别漏了
http_post的第二个参数(也就是JSON格式的请求体$json_data),不然服务器收不到你的数据; - 如果用的是Bearer认证,要确保
$token变量带了Bearer前缀(比如Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...),不然PHP接口可能认不出你的认证信息; - 要是你的脚本是一次性运行的短期脚本,必须加
$request_done->recv,不然脚本会直接退出,请求还没发完就没了;但如果是长期运行的守护进程服务,就可以不用,让AnyEvent的事件循环自动处理就行。
- 别漏了
额外的错误处理建议
除了状态码,你还能通过$res->{Reason}拿到状态描述(比如OK、Forbidden);如果请求连服务器都没连上,$res->{Status}会是0,这时候可以在回调里加日志记录或者重试逻辑。
备注:内容来源于stack exchange,提问作者Ergest Basha
相关产品推荐
相关产品推荐

