多くのタスクでは、投稿リクエストを送信する必要があるかもしれませんが、インターフェイスフォームを使用する必要がないか、使用したくない場合は、php でcurlを使用してフォームの送信をシミュレートできます
。
まずcurlメソッドをカプセル化します
private function curlExec($options) { $ch = curl_init (); curl_setopt_array ( $ch, $options ); // 返回json string $result = curl_exec ( $ch ); // 检查是否有错误发生 if (curl_errno ( $ch )) { $error = "curl exec error! " . curl_error ( $ch ); $result = array ( "code" => "1005", "info" => $error ); } curl_close ( $ch ); return $result; }
次に、パラメータ設定の問題があります。公式ドキュメントは最初少しわかりにくかったので、詳しく説明しましょう:
curl_setopt()については、CURLOPT_POSTに配列を渡します。データを multipart/form -data エンコードに変換しますが、URL エンコードされた文字列を渡すと、データは application/x-www-form-urlencoded でエンコードされます。
まず、$post は配列として渡され、CURLOPT_POST は設定では使用されません
CURLOPT_POST=1
このパラメータは、multipart/form-data 型を application/x-www-form-urlencoded 形式に変換するためのものです。
以下に示すように post リクエストを渡す例は multipart/form-data 形式です:
$post = array ('imagefile' => '@' . $uploadFilePath, 'configfile' => $data ); $url = $this->cfg['baseUrl'].'/upload'; $options = array ( CURLOPT_URL => $url, CURLOPT_POSTFIELDS => $post, CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => 28, CURLOPT_CONNECTTIMEOUT => $this::MAX_CONNECTION_TIME);
以下は URL エンコードされたメソッドであり、実際には文字列を連結してパラメータを渡すことを意味します。
投稿リクエストが application/x-www-form-urlencoded として渡される場合、最初にパラメーターを文字列と連結する必要があり、配列は使用できません。
心配しない場合は、CURLOPT_POST=1 を設定できます。これは CURLOPT_POSTFIELDS= $post で設定する必要があります。
CONTENT_TYPE が常に application/x-www-form-urlencoded であることを確認してください。
例は次のとおりです:
$post = 'ids=123&name=aa';$url = 'http://localhost/Test/test.php'; $options = array ( CURLOPT_URL => $url, CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, CURLOPT_POSTFIELDS => $post, CURLOPT_POST=> 1, CURLOPT_TIMEOUT => 28, CURLOPT_CONNECTTIMEOUT => $this::MAX_CONNECTION_TIME, );
もう 1 つの解決策は、
$options = array ( ... CURLOPT_HTTPHEADER= array('Content-Type: application/x-www-form-urlencoded'),);
他の Head が必要な場合は、自分で追加できます。