You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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";

关键细节唠一唠

  1. 异步的核心逻辑
    咱用AnyEvent->condvar创建了一个条件变量,它的作用就是帮咱“等”到响应码拿到手,同时不阻塞脚本的其他操作。只要回调里拿到了状态码,就调用$request_done->send告诉条件变量“活儿干完了”,脚本就能继续跑别的任务。

  2. 如何快速拿到响应码
    HTTP响应码是在响应头里返回的,所以只要服务器接收到请求并返回了响应头,咱就能通过$res->{Status}拿到它——完全不需要等PHP后端处理完业务逻辑,这正好符合你的需求!

  3. 几个容易踩坑的点

    • 别漏了http_post的第二个参数(也就是JSON格式的请求体$json_data),不然服务器收不到你的数据;
    • 如果用的是Bearer认证,要确保$token变量带了Bearer 前缀(比如Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...),不然PHP接口可能认不出你的认证信息;
    • 要是你的脚本是一次性运行的短期脚本,必须加$request_done->recv,不然脚本会直接退出,请求还没发完就没了;但如果是长期运行的守护进程服务,就可以不用,让AnyEvent的事件循环自动处理就行。
  4. 额外的错误处理建议
    除了状态码,你还能通过$res->{Reason}拿到状态描述(比如OK、Forbidden);如果请求连服务器都没连上,$res->{Status}会是0,这时候可以在回调里加日志记录或者重试逻辑。

备注:内容来源于stack exchange,提问作者Ergest Basha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:39:52