想要使用 cURL 而不是 SimpleXML_load_file()

Posted

技术标签:

【中文标题】想要使用 cURL 而不是 SimpleXML_load_file()【英文标题】:Want to use cURL instead of SimpleXML_load_file() 【发布时间】:2015-02-15 14:34:04 【问题描述】:

使用下面的脚本我可以成功解析 API 数据。

$xml_report_daily=simplexml_load_file("https://api.sitename.com/api/reports/api_get.asp?User=00012345&Key=abcdefghijklmnop&fromDate=11/12/2014&toDate=12/12/2014&mid=25");

foreach ($xml_report_daily as $report_daily):
    $trans_id=$report_daily->TRANSID;
    $trans_id=$report_daily->MID;
    $trans_id=$report_daily->EXT;
    $trans_id=$report_daily->USER;
endforeach;

XML 数据是这样的:

<DATABASE>
    <RECORD>
        <TRANSID>1348818</TRANSID>
        <MID/>
        <EXT>0</EXT>
        <USER>00012345</USER>
    </RECORD>
    .
    .
    .
    so on...
</DATABASE>

但我想使用 cURL 而不是 simplexml_load_file。所以我使用了下面的脚本,但它没有给出任何结果数据。

$url = "https://api.sitename.com/api/reports/api_get.asp?User=00012345&Key=abcdefghijklmnop&fromDate=11/12/2014&toDate=12/12/2014&mid=25"; 
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
$xml = curl_exec($ch);
echo $xml;

请让我知道我错过了什么或做错了什么。

谢谢,

【问题讨论】:

感谢您的回复,在您的帮助下,我发现了我们的问题,现在我想接受您的回答。我该怎么做?你的答案现在是评论。 @Paul Crovella,我不能像使用 SimpleXML 一样使用 foreach 和 cURL 来读取数据。我需要使用什么特殊功能来读取 cURL 数据吗?请让我知道,以便我在这里提供完整的答案。 【参考方案1】:

好的,这是我的完整答案,希望对其他人有用。

我使用 2 种方法从特定链接读取 XML 数据。

方法# 1:使用 simplexml_load_file() - allow_url_fopen 应该在托管服务器上为 ON 以使此方法起作用。这种方法在我的本地和实际服务器上都可以正常工作。

$xml_report_daily=simplexml_load_file("https://api.sitename.com/api/reports/api_get.asp?User=00012345&Key=abcdefghijklmnop&fromDate=11/12/2014&toDate=12/12/2014&mid=25");

foreach ($xml_report_daily as $report_daily):
    $trans_id=$report_daily->TRANSID;
    $m_id=$report_daily->MID;
    $ext_id=$report_daily->EXT;
    $user_id=$report_daily->USER;
    echo $trans_id."&nbsp;".$m_id."&nbsp;".$ext_id."&nbsp;".$user_id."<br/>";
endforeach;

方法# 2:使用 cURL - 按照此处的建议进行操作后,现在此方法在我的本地服务器和实际服务器上都可以正常工作。

$url = "https://api.sitename.com/api/reports/api_get.asp?User=00012345&Key=abcdefghijklmnop&fromDate=11/12/2014&toDate=12/12/2014&mid=25"; 
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
$xml = curl_exec($ch);

$xml_report_daily = simplexml_load_string($xml);

foreach ($xml_report_daily as $report_daily):
    $trans_id=$report_daily->TRANSID;
    $m_id=$report_daily->MID;
    $ext_id=$report_daily->EXT;
    $user_id=$report_daily->USER;
    echo $trans_id."&nbsp;".$m_id."&nbsp;".$ext_id."&nbsp;".$user_id."<br/>";
endforeach;

使用 cURL 时,我没有得到任何结果数据,所以 paul-crovella 建议我检查错误。所以我使用了下面的脚本,我发现我正在尝试访问 Raffy Cortez 也提到的 https(SSL 证书)数据

if(curl_exec($ch) === false)
     echo 'Curl error: ' . curl_error($ch); 
else
     echo 'Operation completed without any errors'; 

要解决这个与 https(SSL 证书)相关的问题,这里有一个非常有用的链接,您可以根据需要使用其中提到的任何方法。

HTTPS and SSL3_GET_SERVER_CERTIFICATE:certificate verify failed, CA is OK

谢谢,

【讨论】:

我遇到了 SimpleXMLElement 的 fopen 限制问题,上面的 cURL 解决了问题。我不确定为什么底层功能没有更新,这似乎是几年前的问题。【参考方案2】:

你在你的cURL中调用https URL,你需要使用

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

【讨论】:

不,你不需要使用它;事实上,你不应该使用它。使用CURLOPT_CAINFO,如this answer 所示。

以上是关于想要使用 cURL 而不是 SimpleXML_load_file()的主要内容,如果未能解决你的问题,请参考以下文章

更正 cURL 的代码

PHP - 为啥使用 Guzzle 而不是 cURL?

curl:如何在 Windows 上使用 Kerberos 而不是 NTLM 身份验证?

为啥 curl 在 mac 上使用 HTTP/1.1 而不是 HTTP/2?

如何使用 CURL 而不是 file_get_contents?

如何使用curl GET而不是POST