2009-06-08 13 views
1

こんにちは私は現在、xmlファイルを外部サーバーに投稿しようとしていますが、ヘッダーが正しくないという応答が返ってきています。私が掲示しているサーバーにはヘッダーがいくつか必要ですが、正しい形式であるか、含まれる必要がある他の「標準」ヘッダーがあるのだろうかと思います。PHP - HTTP Post-incorrect headers

私のコードは次のとおりです。

<?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

サーバーに関する詳細と表示されている正確なエラーメッセージを投稿すると役立ちます。 –

+0

Firebugを使用した場合は、ここにある正確なヘッダー応答を投稿するのに役立ちます。 – andyk

+0

問題はヘッダーが送信されているものとは異なって受信されているなどです。例:VENDOR_IDがベンダーIDとして受信されています。\ BATCH-TYPEがバッチタイプとして受信されています。あなたは私が何を意味するか見yopu'll http://www.xhaus.com/headersに上記の$ URLの値を変更した場合

.... – thegunner

答えて

0

私はこのことについてたくさんの研究をしましたが、決定的な答えはありません。私は手足の外に出て、あなたのヘッダーがダッシュの代わりにアンダースコアを使用しているということが問題だと言います。私はアンダースコアを使用する標準のHTTPヘッダーを考えることはできません。

これはHTTP 1.1 specificationごとに完全に合法です。 RFC 2616によると:

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

それはオプションだ場合、私はバッチ式、バッチカウントおよびベンダーIDを期待するようにサーバを変更することをお勧めします。

Curlがあなたの背中の背中のヘッダー名を変更している場合は、report it as a bugです。

+0

こんにちはスティーブ、私はあなたに完全に同意します - 私が投稿している人はどこかで間違いをしていると思います。上のコードから正しいdoesntのそれを見ますか?なぜこの投稿がうまくいかないのかという明白な目障りなエラーはありませんか? – thegunner

+0

私はちょうど簡単なテストスクリプトを一緒に投げた。 PHPのカール関数はヘッダーを変更していません。そのままで送信されていますが、サーバー側の環境がケースに置き換わり、ケースを「修正」している可能性が非常に高いです。 PHPでは、$ _SERVERでヘッダーを取得しようとすると、HTTP_接頭辞でアップグレーディングされ、 - は_に変換されます。元の書式は失われます。 –

+0

ええ、それは正しいケースではありません;ヘッダーの問題は、それらの仕様に含まれています...そして_も変更されています...ただ、私のヘッダーでprobがないことを受け入れるでしょう...それは別のものでなければなりません彼らの最後には何かがあります。手伝ってくれてありがとう。 – thegunner

0

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

を試すか

$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 

リンク多分例を支援することを使用します。 http://www.nabble.com/Problems-posting-xml-file-with-curl-and-php-td16129807.html

+0

あなたは、リクエスト置くことを言っている:$ヘッダを[] = $ xml_data; curl_setopt($ ch、CURLOPT_POSTFIELDS、$ xml_data);ではなく、 です。 – thegunner

+0

こんにちは、外部サーバーが必要とするヘッダーはどうですか? $ headers [0] = "BATCH_TYPE:XML_SINGLE"; $ headers [1] = "BATCH_COUNT:1"; $ headers [2] = "VENDOR_ID:53906"; ありがとうございます。 – thegunner

+0

okは動作していません.... – thegunner

0

投稿されるスクリプトとしてローカルスクリプトを使用する場合、出力は正しいです。

ローカルスクリプトは、単純にそう

<?php 
    phpinfo(); 
?> 

で構成されて、私はこの問題は、あなたのコードではなくhttp://www.xhaus.com/headersで表示していないと思います。そのサイトは表示のためにアンダースコアをダッシュ​​で置き換えているようです。なぜあなたのphpinfoスクリプトではなく、結果を表示するためにそのURLを使用するのですか?