【问题标题】:Callback from API not happening after posting parameters to API URL from server side从服务器端将参数发布到 API URL 后,API 的回调没有发生
【发布时间】:2010-08-31 12:47:11
【问题描述】:

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

要求
从客户端隐藏客户令牌值。所以我开始发送服务器端发布请求。

问题
我尝试了很多选项,但没有发生回调 -

1) 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, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,  $encoded);
$resp = curl_exec($ch);
curl_close($ch);
echo $resp;

如果curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 行被删除但回调没有发生,则$resp 回显1。我正在回调脚本中设置会话变量来验证。是否需要 API 同步才能使用 curl 方法,以便 curl_exec 返回响应?

2) 没有 Posting parameters to a url using the POST method without using a form 中给出的 CURL

但是回调没有发生。

我也尝试使用以下代码,但看起来我的 pecl 安装不正确,因为未定义 HttpRequest()。

$req = new HttpRequest($apiUrl, HttpRequest::METH_POST);
$req->addQueryData($params);

try 
{
    $r->send();
    if ($r->getResponseCode() == 200) 
    {
     echo "success";
        // success!
    }
    else 
    {
     echo "failure";
        // got to the API, the API returned perhaps a RESTful response code like 404
    }
}
catch (HttpException $ex) 
{
    // couldn't get to the API (probably)
}

请帮帮我!我只需要轻松发送服务器端的 post 请求并在回调文件中获取响应。

【问题讨论】:

  • 我猜问题出在其他地方。回调完全是 API 的责任,只要方法 1(cURL)返回 1(我猜这是预期的输出),问题就不在这里了。

标签: php api curl httprequest httpresponse


【解决方案1】:

尝试使用 curl_get_info() 函数调试您的请求:

$header = curl_getinfo($ch);
print_r($header);

您的请求可能没问题,但我的结果是错误 404。

编辑:如果您想执行发布请求,请将其添加到您的代码中:

curl_setopt($ch, CURLOPT_POST, true);

编辑:我在您的代码中提到的其他内容:您在“CURLOPT_RETURNTRANSFER”中使用了“1”,但应该是“真”:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

至少我通常是这样做的,你永远不知道函数是否也会将'1'理解为'true';

编辑:真正的问题:我复制粘贴了您的源代码并在我的一个页面上使用它,出现此错误:

Warning: urlencode() expects parameter 1 to be string, array given in C:\xampp\htdocs\phptests\test.php on line 8

错误在这一行:

foreach($_postArray as $name => $value) 

$_postArray 是一个数组,其中一个值包含其他值,您需要另一个 foreach 或简单地使用:

foreach($_postArray['customer_token'] as $name => $value) 

【讨论】:

  • curl_getinfo($ch) 的输出给出 - Array ( [url] => http:// [content_type] => text/html [http_code] => 200 [header_size] => 163 [request_size] => 743 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.183987 [namelookup_time] => 0.175189 [connect_time] => 0.175267 [pretransfer_time] => 0.175276 [ size_upload] => 586 [size_download] => 0 [speed_download] => 0 [speed_upload] => 3185 [download_content_length] => -1 [upload_content_length] => -1 [starttransfer_time] => 0.183932 [redirect_time] => 0) ` 所以http_code 是 200(看起来没有错误)。
  • 你的请求只是空的。但我刚刚看到,您正在尝试发出发布请求。比你还必须告诉 CURL。查看我的编辑。
  • 我没有在我的问题中错误地写curl_setopt($ch, CURLOPT_POST, true);。现在添加。谢谢,但我展示的数组输出是针对curl_setopt($ch, CURLOPT_POST, true); 存在于代码中的情况。
  • 好的,我替换了代码和我的问题中的 0 和 1,但没有成功。 CURLOPT_RETURNTRANSFER 是真还是假?如果我保持真实,echo $resp; 不会给出 1。我认为这只是为了获得响应。
  • 一定是真的。但我认为我发现了您的请求的真正问题,请参阅我的上次编辑。
【解决方案2】:

正如previous question 中所讨论的,回调与您的请求完全不同。回调也不会包含会话变量,因为远程 API 充当回调脚本的客户端,并且有自己的会话

您真的应该在这里展示一些 API 文档。也许我们彼此误解了,但据我所知,您正在尝试做的事情(在初始 CURL 请求中获取回调值)是徒劳的,并且两次询问也不会变得徒劳无功。

【讨论】:

  • 在同意您的解释后,我已经离开尝试在上一个问题的初始 CURL 请求中获取回调值。现在我只是想在回调文件中设置一个会话值,但这并没有发生。
  • @sandeepan 是的,在回调文件中,API 充当“浏览器”,因此它的会话与您当前的会话不同。通常,API 应该在回调中返回一个唯一的键,这样您就可以知道它属于哪个请求(如果键是会话 ID,甚至可以继续会话)。您的 API 中真的没有任何效果吗?那会很奇怪。
  • 这个 API 有很多奇怪的地方,为此我苦苦挣扎。它仍在修复错误,当我们发现错误时,他们会进行更改。
猜你喜欢
  • 2017-05-31
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2013-10-30
  • 2020-03-21
相关资源
最近更新 更多