2009-06-08 10 views
1

Salut J'essaie actuellement de publier un fichier XML sur un serveur externe, mais je reçois une réponse en retour que les en-têtes sont incorrects. Le serveur que je poste nécessite des en-têtes et je me demande s'ils sont dans le bon format ou s'il y a d'autres en-têtes "standards" qui doivent être inclus?PHP - HTTP Post - en-têtes incorrects

Mon code est:

<?php 

function httpsPost($Url, $xml_data, $headers) 
{ 
    // Initialisation 
    $ch=curl_init(); 
    // Set parameters 
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);  
    curl_setopt($ch, CURLOPT_URL, $Url); 
    // Return a variable instead of posting it directly 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch,CURLOPT_USERPWD,"username:password"); 
    // Active the POST method 
    curl_setopt($ch, CURLOPT_POST, 1) ; 
    // Request 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    // execute the connexion 
    $result = curl_exec($ch); 
    // Close it 
    curl_close($ch); 
    return $result; 
} 

$headers[0]="BATCH_TYPE: XML_SINGLE"; 
$headers[1]="BATCH_COUNT: 1"; 
$headers[2]="VENDOR_ID: 53906"; 

$request_file = "./post_this.xml"; 
$fh = fopen($request_file, 'r'); 
$xml_data = fread($fh, filesize($request_file)); 
fclose($fh);  

$url = 'http://www.example.com/test.php'; 

$Response = httpsPost($url, $xml_data, $headers); 

echo $Response; 

?> 
+0

Il peut être utile si vous publiez plus d'informations sur le serveur et le message d'erreur exact que vous voyez. –

+0

Si vous utilisez Firebug, il peut être utile de poster la réponse d'en-tête exacte que vous avez ici. – andyk

+0

Le problème est que les en-têtes sont reçus différemment de ce qui est envoyé, par exemple: VENDOR_ID est reçu en tant qu'ID du fournisseur \ n BATCH-TYPE est reçu en tant que type batch. \ N Quelqu'un sait comment trier cela?

si vous changez la valeur de $ url ci-dessus pour voir http://www.xhaus.com/headers yopu'll ce que je veux dire .... – thegunner

Répondre

0

J'ai fait beaucoup de recherches sur celui-ci, mais je n'ai pas de réponse définitive. Je vais sortir d'un doute et dire que je pense que le problème est que vos en-têtes utilisent des traits de soulignement au lieu de tirets. Je ne peux pas penser à un en-tête HTTP standard qui utilise des underscores. Ceci est parfaitement légal selon le HTTP 1.1 specification. Selon RFC 2616:

message-header = field-name ":" [ field-value ] 
field-name  = token 
token   = 1*<any CHAR except CTLs or separators> 
separators  = "(" | ")" | "<" | ">" | "@" 
        | "," | ";" | ":" | "\" | <"> 
        | "/" | "[" | "]" | "?" | "=" 
        | "{" | "}" | SP | HT 

Si c'est une option, je vous suggère de changer le serveur d'attendre Lot-Type, Lot-Count et fournisseur-Id.

Si Curl modifie vos noms d'en-tête derrière votre dos, vous devez report it as a bug.

+0

Salut Steve, je suis totalement d'accord avec vous - je pense que les gens à qui je poste font une erreur quelque part. A partir du code ci-dessus, il ne semble pas correct? Il n'y a pas d'erreur flagrante évidente de pourquoi ce post ne fonctionne peut-être pas? – thegunner

+0

Je viens de jeter ensemble un script de test rapide. Les fonctions curl de PHP ne changent pas les en-têtes. Ils sont envoyés tels quels, cependant, il est très possible que l'environnement côté serveur remplace _ avec - et "corrige" l'affaire. En PHP, si vous essayez d'obtenir les en-têtes dans $ _SERVER, ils sont mis à jour avec un préfixe HTTP_ et sont convertis en _. Le formatage d'origine est perdu. –

+0

ouais c'est bon cas doesn; t dans les en-têtes c'est dans la spécification pour eux ... et _ a changé aussi .... juste va accepter qu'il n'y a pas un problème avec mes en-têtes ... ça doit être quelque chose d'autre ou quelque chose à leur fin. Merci pour l'aide. – thegunner

0

essayer

curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml")); 
curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Accept: text/xml")); 

ou utiliser que

$header[] = "Host: ".$host; 
$header[] = "MIME-Version: 1.0"; 
$header[] = "Accept: text/xml"; 
$header[] = "Content-length: ".strlen($xmlRequest); 
$header[] = "Cache-Control: no-cache"; 
$header[] = "Connection: close \r\n"; 
$header[] = $xmlRequest; // Contains the XML request 
lien

aider peut-être l'exemple: http://www.nabble.com/Problems-posting-xml-file-with-curl-and-php-td16129807.html

+0

Voulez-vous dire à mettre en demande: $ header [] = $ xml_data; plutôt que: curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ xml_data); – thegunner

+0

Salut, Qu'en est-il des en-têtes requis par le serveur externe?: $ headers [0] = "BATCH_TYPE: XML_SINGLE"; $ headers [1] = "BATCH_COUNT: 1"; $ headers [2] = "VENDOR_ID: 53906"; Merci, – thegunner

+0

ok ça ne marche pas .... – thegunner

0

Si j'utilise un script local en tant que script en cours de publication, la sortie est correcte.

Le script local consiste simplement

<?php 
    phpinfo(); 
?> 

Donc, je suppose que le problème est pas avec votre code, mais avec l'affichage à http://www.xhaus.com/headers. Ce site semble remplacer les traits de soulignement par des tirets pour l'affichage. Pourquoi utiliser cette URL pour afficher les résultats et pas votre propre script phpinfo?