私はサードパーティのAPIを使っていて(この質問の目的のためにはどちらにも関係ありません)、外部サービスにPOSTリクエストを送る必要があります。
私はwp_remote_post
を使って必要なものを実現しようとしていますが、リクエストボディで送信できるデータ量には限界があるようです。
本文に 最大1024文字が含まれる場合のみ _が送信されます。 1文字以上で(明らかに)要求は送信されません。
ngrok を使用して$url
でPOST要求を待機し、手動で "bla bla bla(...)"の文字列として$body
を設定することで問題をデバッグしようとしています。 $body
に含まれる文字数が1024文字以下の場合にのみ表示されます。 5xxエラーやその他のエラーメッセージが表示されません。実際、is_wp_error( $response )
はfalseを返します。
ただし、 Postman などのツールを使用して、同様のPOSTrequest outside WP を生成する場合、ngrokそれだけで大丈夫です。
すべてのテストは私のローカルマシン上で行われ、WordPress 4.9.5はデフォルトのWordPressイメージでDockerコンテナ内で実行されており、以下のカスタムphp ini行を除いて未修正のデフォルト設定を使用します。
file_uploads = On
memory_limit = 64M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600
$response = wp_remote_post( $url,
array(
'timeout' => 60,
'redirection' => 5,
'blocking' => true,
'headers' => array(
'Content-Type' => 'application/json',
),
'body' => 'bla bla (...)' // fails if larger than 1024
)
);
if ( is_wp_error( $response ) ) {
$error_message = $response->get_error_message();
echo "Something went wrong: $error_message";
} else { echo "Request sent"; }
あなたが偶然CURLトランスポートを使用しているのであれば、それは時々1024文字を超えるPOSTリクエストを送ることに小さな問題を抱えています。詳細はこちら:
https://stackoverflow.com/questions/463144/php-http-post-fails-when-curl-data-1024
空のExpect:ヘッダを送信することをお勧めします。このようにコードを修正することでこれを行うことができます。
$response = wp_remote_post( $url,
array(
'timeout' => 60,
'redirection' => 5,
'blocking' => true,
'headers' => array(
'Content-Type' => 'application/json',
'Expect' => '',
),
'body' => 'bla bla (...)' // fails if larger than 1024
)
);
編集:詳細情報:
CurlとPHPのバージョンによっては、本文に1024文字を超える文字を入力すると、最初にヘッダーを送信し、次に "Expect:100-continue"ヘッダーを送信します。これを受信したWebサーバーは、クライアントが本文の残りの部分を送信し続けるために100 Continueステータスで応答する必要があります。
本物のWebサーバーを使用している場合は、その応答を送信して残りのメッセージを受信します。一部の古いWebサーバーはこれを行わなかったため、その前の質問で指定された回避策がありました。
Ngrokが何であるかはわかりませんが、ここでは通常のWebサーバーのように応答していないと思います。そのサーバーがPOSTを続行するように指示せずに、curlはそれが行われるのを待ちます。やがてタイムアウトします。