4

PHP 5.2 と cURL を使用して、ベンダーのサーバーに対して POST しようとしています。サーバーに対して投稿する XML ドキュメントを読み込んでから、応答を読み込んでいます。

$request = trim(file_get_contents('test.xml'));
$curlHandle = curl_init($servletURL);
curl_setopt($curlHandle, CURLOPT_POST, TRUE);
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curlHandle, CURLOPT_HEADER, FALSE);  # Have also tried leaving this out
$response = curl_exec($curlHandle);

そのコード自体は正常に動作しますが、他のサーバーは XML パーサーから次のような応答を返します。

プロローグで許可されていないコンテンツ

そのエラーを調べたところ、これは通常、XML の前の空白が原因で発生しますが、XML ファイル自体に空白が含まれていないことを確認し、trim() でそれをクリアする必要があります。コードの実行中に接続で TCPDump を実行したところ、次のように送信されました。

POST {serverURL} HTTP/1.1
Host: {ip of server}:8080
Accept: */*
Content-Length: 921
Expect: 100-continue
Content-Type: multipart/form-data; boundry:---------------------------01e7cda3896f

---------------------------01e7cda3896f
Content-Disposition: form-data; name="XML"

[SNIP - the XML was displayed]

---------------------------01e7cda3896f--

Ethereal でセッションを再生すると、[SNIP] 行の前後に空白が表示されます。これが問題の原因ですか?もしそうなら、どうすればそれを取り除くことができますか?

4

3 に答える 3

3

答えではありませんが、コードを見ると、fopen/fread/fclose 全体を熟読するのは非常に退屈だと思います。

以下を置き換えることができます。

$file = 'test.xml';
$fileHandle = fopen($file, 'r');
$request = fread($fileHandle, filesize($file));
fclose($fileHandle);
$request = trim($request);

と:

$request = trim(file_get_contents('test.xml'));

とにかく - あなたの質問に; それらが送信されているヘッダーである場合、リモートサーバーの問題ではありません。xml ファイルの内容を変更し、var_dump() を使用して正確な出力を確認してください (文字列の長さを含むため、不足しているものを探すことができます)。

それが役立つことを願っています

于 2008-08-20T15:22:50.293 に答える
2

エンコーディングの問題であることが判明しました。アプリは明らかにform-dataではなくwww-form-urlencodedのXMLを必要としているため、次のように変更する必要がありました。

# This sets the encoding to multipart/form-data
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));

# This sets it to application/x-www-form-urlencoded
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'XML=' . urlencode($request));
于 2008-08-20T16:11:31.750 に答える
0

私はawc -m test.xmlを実行し、XMLファイルで743文字で戻ってきましたが、var_dumpon$requestは742文字で戻ってきたので、何かが削除されていtrim()ます(私は推測します)。

私はした:

print "=====" . $request . "=====";

XMLの開始と終了は、空白なしで=====に直接一致します。

于 2008-08-20T15:39:42.670 に答える