使用CURL返回XML响应

时间:2016-02-23 15:16:21

标签: php xml curl

我通过HTTP POST将一些参数传递给网络服务器。

我得到了一个响应,但理想情况下我想要一个完整的XML响应,而我似乎只得到一个连接的字符串。我已经尝试过SimpleXMLElement,但它似乎没有做任何事情,也没有返回任何XML。

以下是我的代码:

$post_string = '<?xml version="1.0" encoding="utf-16" ?> 
<ChameleonIAPI>
  <Method>TitleList</Method> 
  <APIKey>D12E9CF3-F742-47FC-97CB-295F4488C2FA</APIKey> 
  <UserName>David</UserName>
  <Filter>
  </Filter>
</ChameleonIAPI>';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"https://jobs.chameleoni.com/PostXML/PostXml.aspx");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
        "Action=postxml&AuthKey=Guest&AuthPassword=KgwLLm7TL6G6&Xml=$post_string");

// receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);

$server_output = curl_exec ($ch);

echo $server_output." TEST <br />";
curl_close ($ch);

$oXML = new SimpleXMLElement($server_output);

foreach($oXML->entry as $oEntry){
  echo $oEntry->title . "\n";
}

这是您甚至可以测试POST和XML的页面。

https://jobs.chameleoni.com/PostXML/PostingXML.html

我的XML似乎没问题,因为它适用于测试页面。我认为我的PHP有问题,虽然我不知道那是什么!

任何帮助都很可爱!

2 个答案:

答案 0 :(得分:6)

您的代码检索完整的XML,看它写:

echo htmlentities( $server_output );
die();

在浏览器中你会看到:

  

&lt;?xml version =“1.0”encoding =“utf-16”?&gt;   &LT; ChameleonIAPIResponse&GT;

     

&LT;标题和GT;&LT; TitleId→1&LT; / TitleId&GT;&LT;名称&GT;&LT; /标题&GT;&LT; TitleId→6&LT; / TitleId&GT;&LT;名称&GT;先生&LT; /标题&GT;&LT; TitleId→2&LT; / TitleId&GT;&LT;名称&GT;杜&LT; /标题&GT;&LT; TitleId→3&LT; / TitleId&GT;&LT;名称&GT;小姐&LT; /标题&GT;&LT; TitleId→4&LT; / TitleId&GT;&LT;名称&GT;女士&LT; /标题&GT;&LT; TitleId&GT ; 5'; / TitleId&GT;&LT;名称&GT; DR&LT; /标题&GT;&LT; TitleId&GT; 43&LT; / TitleId&GT;&LT;名称&GT;爵士&LT; /标题&GT;&LT; /标题和GT;   &LT; / ChameleonIAPIResponse&GT;

问题是浏览器将您的输出解释为HTML,因此隐藏了标记(请参阅浏览器页面源代码,您将找到完整的XML)。

此外,要在发送适当的标头之前将XML作为XML发送:

header( 'Content-type: text/xml' );
echo $server_output;
die();

上面代码之前和之后没有其他输出,否则你的XML会被破坏。

如果您更喜欢SimpleXML,可以这样做:

$oXML = new SimpleXMLElement( $server_output );
header( 'Content-type: text/xml' );
echo $oXML->asXML();
die();

同样在这种情况下, 之前和之后没有输出(因此请注释前一行)。

答案 1 :(得分:0)

您需要传递Content-Type标头,其值为application/x-www-form-urlencoded

此外,xml有效负载需要进行urlencoded。

示例$post_string与您的问题相同

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"https://jobs.chameleoni.com/PostXML/PostXml.aspx");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_POSTFIELDS,
        "Action=postxml&AuthKey=Guest&AuthPassword=KgwLLm7TL6G6&Xml=" . urlencode($post_string));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);

$server_output = curl_exec ($ch);

curl_close ($ch);

var_dump($server_output);

将输出

string(374) "<?xml version="1.0" encoding="utf-16" ?>
<ChameleonIAPIResponse>

<Titles><TitleId>1</TitleId><Title></Title><TitleId>6</TitleId><Title>Mr</Title><TitleId>2</TitleId><Title>Mrs</Title><TitleId>3</TitleId><Title>Miss</Title><TitleId>4</TitleId><Title>Ms</Title><TitleId>5</TitleId><Title>Dr</Title><TitleId>43</TitleId><Title>Sir</Title></Titles>
</ChameleonIAPIResponse>"