【问题标题】:Simple Curl request not working简单的卷曲请求不起作用
【发布时间】:2011-08-10 11:32:49
【问题描述】:

我有一个函数 make_curl_request 来发出 curl 请求。

/**
 * General Function to make curl request */
function make_curl_request($url, $data)
{
    ob_start();
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_exec($ch);
    curl_close($ch);
    $strCurlResponse = ob_get_contents();
    ob_end_clean();
    return $strCurlResponse;
}

我这样称呼它:

$strGatewayResponse = make_curl_request( REQUEST_URL, compact('strMobileNo', 'strKeywords', 'strApiKey') );

我尝试了这些方法,但无法让我的代码正常工作。目前它只是返回 string("") 作为输出。我哪里错了?

我的目标是简单地将少量数据发布到位于其他域的下一页并获取其 xml 响应并对其进行解析并显示它。有没有其他简单又好的解决方案?

【问题讨论】:

  • 第一步:echo curl_error();
  • 我得到 0.... 即。回声 curl_error($ch) => 输出 = 0

标签: php curl cross-domain


【解决方案1】:

问题在于您将 RETURNTRANSFER 设置为 TRUE,这意味着 curl 返回其输出而不是直接输出。但是,您没有在变量中捕获该输出,所以它会掉到地上。

你有两个选择

a) 移除 ob_*() 函数以移除 PHP 缓冲,然后执行

$data = curl_exec($ch)
if ($data === FALSE) {
    die("Curl failed: " . curL_error($ch));
}

之后,$data 包含您获取的 URL 的内容。

b) 删除 RETURNTRANSFER 选项,让 curl 执行其正常的“直接输出到客户端”的操作,然后由 PHP 输出缓冲捕获。

【讨论】:

  • gr8 pinpoint...谢谢它帮助...我还需要 3 分钟才能将其选为正确
【解决方案2】:

在没有标头的情况下发送 curl POST 是不行的。 请找到以下链接。它可能会有所帮助 OAuth, PHP, Rest API and curl gives 400 Bad Request

【讨论】:

    【解决方案3】:

    尝试添加一行:

    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    

    FALSE 阻止 cURL 验证对等方的证书。可以使用 CURLOPT_CAINFO 选项指定要验证的备用证书,也可以使用 CURLOPT_CAPATH 选项指定证书目录。

    【讨论】:

    • 使用以下命令为本地主机测试执行此操作:if (substr($_SERVER['HTTP_HOST'],0,4) != 'www.') {curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);} 这假定您 需要 www.强烈建议在实时(或“生产”)环境中为您的域添加前缀。因为让 SSL 在 localhost 上正常工作,就等于在互联网上赢得了一场政治争论。
    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2016-04-16
    • 2012-04-08
    • 2011-10-27
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多