【问题标题】:Getting an API's response through curl's curl_exec() instead of the usual callback file通过 curl curl_exec() 而不是通常的回调文件获取 API 响应
【发布时间】:2011-04-06 03:05:39
【问题描述】:

API 集成说明
API 需要使用一些输入字段和客户令牌将表单发布到 API URL。 API 处理然后将响应发布到我服务器上的 callback.php 文件(根据文档已修复,我们不能提及我们希望将响应发布到其他文件)。我可以使用该文件中的 $_POST 访问发布的 val。这就是现有方法的全部内容,并且效果很好。

现在,我想知道是否可以通过 curl 获取整个响应作为 curl_exec() 函数的返回值?我对 curl 没有经验。

我执行了以下代码:-

$ch = curl_init(API_URL);
$encoded = '';
$_postArray['customer_token'] = API_CUSTOMER_TOKEN;

foreach($_postArray as $name => $value) 
{
     $encoded .= urlencode($name).'='.urlencode($value).'&';
}

// chop off last ampersand
$encoded = substr($encoded, 0, strlen($encoded)-1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,  $encoded);
$resp = curl_exec($ch);
curl_close($ch);
echo $resp;

没有响应,但如果我注释掉 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 行,$resp 值会回显 1 而不是我预期的数组 ($_POST)。这个1是否表示检测到API处理成功?

如果这不可能,请告诉我如何修改上述内容,以至少在 callback.php 文件中获得 $_POST 的响应,就像之前发生的那样。

更多关于当前状态和我想要的描述
我想将响应作为 curl_exec() 的返回值,以便我可以使用 ajax 响应将前端中的页面重定向到成功页面(我想通过 ajax 调用 curl 发布从前端保持相同页面的表单提交显示直到来自 API 的响应)。

目前,我通过隐藏 iframe 发布 API 表单(以保持显示同一页面)、启动 javascript 计数器以检测会话 ['api_success'] 变量并设置会话 ['api_success']在 callback.php 文件中(在 API 成功响应之后)。我想放弃该方法,因为它随时可能中断,并且在 linux firefox 2 中失败。

更新
同意使用这种异步 API,除了频繁轮询设置状态标志之外别无选择。所以,请帮我修改上面的代码,以便在回调文件中接收响应。目前还没来。

谢谢, 桑迪潘

【问题讨论】:

    标签: php api curl httpresponse


    【解决方案1】:

    现在,我想知道是否可以通过 curl 获取整个响应作为 curl_exec() 函数的返回值?

    我不知道您所说的 API,但很可能不知道。 API 可能会启动一个后台进程,在完成后触发回调。在这种设置中,原始请求不会收到返回值。

    【讨论】:

    • @Pekka,我编辑了我的问题 - 最初没有响应,但如果我注释掉 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 行,$resp 值会回显 1 而不是像我一样的数组 ($_POST)预期的。这个1是否表示检测到API处理成功?
    • 如果原始请求无法收到返回值,那我还有什么其他选择?我不想每隔几毫秒左右使用任何类型的 for 循环来检查状态。任何可能的内置等待逻辑,以便对 ajax 调用返回真实响应?我希望这个逻辑在服务器端并且对客户端不可见。早些时候,我使用了我的问题中描述的 javascript 逻辑。谢谢
    • @sandeepan 见php.net/curl_exec Returns TRUE on success or FALSE on failure. 仅表示CURL请求成功。它并不表示 API 响应。
    • @sandeepan 如果 API 是异步的,您将别无选择,只能使用回调脚本在成功时更改某些标志,并进行频繁的轮询 - 无论是在 PHP 端,还是在客户端使用Ajax - 检测标志变化!
    • 感谢您的解释。同意。请阅读我的更新。
    猜你喜欢
    • 2018-01-23
    • 2016-04-23
    • 2020-07-21
    • 1970-01-01
    • 2014-10-03
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多