2010-12-02 21 views
6

J'essaie d'envoyer une requête HTTPS POST avec des données XML à un serveur utilisant PHP.PHP https post XML data avec cURL

Tout ce qui est envoyé au serveur nécessite une authentification, donc je vais utiliser cURL.

Quelques informations de base .: les données XML est de demander au serveur de télécharger un fichier à partir d'une URL spécifique à son stockage local.

Une règle d'utilisation de cette API est que je DOIT définir le type de contenu pour chaque demande à application/xml.

C'est ce que je l'ai fait, mais ne fonctionne pas ...

<?php 
$fields = array(
'data'=>'<n1:asset xmlns:n1="http://.....com/"><title>AAAA</title><fileName>http://192.168.11.30:8080/xxx.html</fileName><description>AAAA_desc</description><fileType>HTML</fileType></n1:asset>' 
); 
$fields_string = ""; 
foreach($fields as $key=>$value) { 
$fields_string .= $key.'='.$value.'&'; 
} 
rtrim($fields_string,'&'); 

$url = "https://192.168.11.41:8443/"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, count($fields)); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 

curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_USERPWD, "admin:12345678"); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/xml', 'Content-length: '. strlen($fields_string))); 

$result = curl_exec($ch); 

curl_close($ch); 

echo $result; 
?> 

Je suis censé obtenir une réponse XML soit réussi ou télécharger télécharger échoué. Mais à la place, j'obtiens ce message d'erreur.

HTTP/1.1 415 Type de Unsupported Media Server: Apache-Coyote/1.1 Content-Type: text/xml; charset = UTF-8 Content-Length: 0 Date: Jeu 2 décembre 2010 03 : 02: 33 GMT

Je suis sûr que le type de fichier est correct, le format XML est correct. J'ai essayé urlencode les champs mais cela n'a pas fonctionné. Quoi d'autre que j'aurais pu faire de mal?

Répondre

0

Peut-être pourriez-vous essayer text/xml au lieu d'application/xml?

+0

essayé, ne fonctionnait pas ni – EDDIU

0

Vous devez faire, dans votre code d'origine:

curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields['data']); 

ou

curl_setopt($ch, CURLOPT_POSTFIELDS, '<n1:asset xmlns:n1="http://.....com/"><title>AAAA</title><fileName>http://192.168.11.30:8080/xxx.html</fileName><description>AAAA_desc</description><fileType>HTML</fileType></n1:asset>'); 

Je veux dire que vous devez envoyer le XML directement.

+0

juste essayé, qui ne fonctionne pas. Il a répondu avec le même message d'erreur. – EDDIU

3

je résous avec

$xml = $this->getXml(); 
$url = $this->getUrl(); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
             'Content-type: application/xml', 
             'Content-length: ' . strlen($xml) 
            )); 
$output = curl_exec($ch); 
curl_close($ch); 
+0

Quelle est la différence entre curl_setopt ($ ch, CURLOPT_POST, 1); et curl_setopt ($ ch, CURLOPT_POST, true); Qu'est-ce que cela dit exactement à CURL? – TimNguyenBSM