0

CURL を使用して HTTP ポスト リクエストをリモート サーバーに送信する単純な PHP スクリプトがあります。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://91.250.77.10/test.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('a' => 'b'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error) 
    echo $error;
else
    echo $contents;

これにより、「サーバーからの応答がありません」というエラーが発生します。リモートサーバーのアクセスログにもリクエストが見つかりません!

さらに、ポストフィールドをクエリ文字列として送信すると、次のようになります。

curl_setopt($ch, CURLOPT_POSTFIELDS, '&a=b');

その後、すべてがうまくいきます。

リモート サーバーの Apache または PHP の構成に問題があるようです。ヒントはありますか?

編集:

今のところ、サーバーは Content-Type: multipart/form-data のリクエストを受け入れない (または正しく処理しない) ようです (CURL は配列をポストフィールドとして設定するときにそのタイプを使用しますが、文字列を設定するときは使用しません)。

リクエストでファイルを送信する必要があるため、multipart/form-data を使用する必要があります。では、サーバーがこれを正しく処理するにはどうすればよいでしょうか?

4

3 に答える 3

0

リクエストを行う最善の方法POSTは、このように postFields をフォーマットすることです。

VARIABLE = VALUEで区切られてい&ます。

ヒント:

$postFields = 'var1=cons1&var2=cons2&var3=cons3&var4=cons4&var5=cons5';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://91.250.77.10/test.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error) 
    echo $error;
else
    echo $contents;

これ以上お役に立てば幸いです。

于 2013-07-18T08:54:14.827 に答える
0

に配列を渡すとCURLOPT_POSTFIELDS、フォームが次のように送信されmultipart/form-dataます。リモート エンドがこのエンコーディング タイプを受け入れていない可能性があります。

于 2013-07-18T07:46:26.983 に答える
0

HTTP ヘッダーに「Expect:100-continue」フィールドが含まれているかどうかを確認します。一部のサーバーは、このフィールドを処理せず、待機するだけです。あなたが試すことができます:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect: '));

詳細については、次を参照してください: curl http 100 continue および multipartform-data post

于 2013-07-18T09:01:37.427 に答える