2011-06-24 130 views
2

我試圖做一個XML發佈請求,期望使用curl響應來構建標題和內容。這是我的代碼:PHP捲曲問題 - 試圖發送XML發佈請求

<?php 
function post_xml($url, $xml) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: application/xml; charset=utf-8")); 
    curl_setopt($ch, CURLOPT_USERPWD, 'myusername:mypassword'); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

    $result = curl_exec($ch); 
    $info = curl_getinfo($ch); 
    curl_close($ch); 
    return $result; 
} 

$xml = '<?xml version="1.0" encoding="UTF-8"?><testing><test type="integer">1</test></testing>'; 

$url = "http://example.com/api/test.php"; 
$result = post_xml($url, $xml); 
echo "<pre>"; print_r($result); echo "</pre>"; 
?> 

要查看我的呼出請求我使用:

$info = curl_getinfo($ch); 
echo($info['request_header']); 

所發送的生成的HTTP請求是:

POST /api/test.php HTTP/1.1 
Authorization: Basic pwmtJdCVwNEawdaODH 
Host: example.com 
Accept: */* 
Content-Type: application/xml; charset=utf-8 
Content-Length: 95 

的內容長度爲95,但是下面沒有顯示任何xml內容。這會導致422不可處理的實體錯誤。我完全錯過了什麼嗎?我希望能夠在發送的請求中看到XML。

+0

問題必須與遠程API;你的代碼肯定是在移動數據。我用一個腳本測試它,它只會將原始postbody轉儲到測試文件並返回請求的散列,並且它工作得很好。 – Dereleased

+0

等待!你在瀏覽器中查看這個嗎?它可能會隱藏你的XML!試試這個,而不是print_r:'echo'

', htmlentities($result), '
';' – Dereleased

+0

對不起,我發佈的請求是原始請求。我認爲這可能是我嘗試使用的API的一個問題,所以我會與他們聯繫。這一直都讓我堅持了整整一個早上,但我完全遵循他們的文檔。 – Brian

回答

2

您還沒有爲您的XML內容指定一個字段名,所以PHP無處可以在POST請求中分配它。作爲manual狀態:

此參數可以或者作爲像urlencoded的字符串被傳遞「PARA1 = VAL1 & PARA2 = val2的& ...」或者作爲與字段名作爲值作爲密鑰和字段數據的數組。

所以嘗試:

curl_setopt($ch, CURLOPT_POSTFIELDS, array('xml' => $xml)); 

不知道如果這是你的API期待,但它是一個事看看。

至於顯示XML,請記住,瀏覽器可以/將它解釋爲HTML,並且任何未知標記將不會被顯示。試着做你的輸出:

echo "<pre>"; 
echo htmlspecialchars($result); 
echo "</pre>"; 

和/或輸出header('Content-type: text/plain')這樣XML標籤將被原樣顯示和不能被解釋爲未知的HTML標籤。

0
echo($info['request_header']); 

將只顯示已發送的標頭。它不會顯示發佈數據,所以你不應該看到XML字符串。

+0

有什麼方法可以輕鬆查看發送的整個消息嗎? – Brian

0

它的工作原理,當我刪除了標題行:

//curl_setopt($ch, CURLOPT_HTTPHEADER, ... 

最終代碼:

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array('data' => $xml)); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);