2012-04-29 20 views
3

PHPのcURLスクリプトでPOSTリクエストを送信する際に問題が発生しています。cURL POST:400無効なコンテンツの長さ

私は自分の個人的な使用のために、プロキシを作成しようとしています。これは、サーバー経由でWebページを取得し、ローカルに表示します。私はそのページ上のフォームで投稿する場合は、それはに行きますhttp://fetch.example.com/http://theurl.com/

URLはそうのように発見されましたフォームのACTION(前にURLを取得)。以下のコードを使用してこのPOSTリクエストを処理させようとしていますが、私がPOSTするものは常に400 Bad Requestエラーをもたらします。

$chpg = curl_init(); 
curl_setopt($chpg, CURLOPT_URL, $_URL); 
curl_setopt($chpg, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($chpg, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($chpg, CURLOPT_COOKIESESSION, true); 
curl_setopt($chpg, CURLOPT_COOKIEJAR, "cookies/$_COOKIE_FILE.$_DOMAIN.txt"); 
curl_setopt($chpg, CURLOPT_COOKIEFILE, "cookies/$_COOKIE_FILE.$_DOMAIN.txt"); 
if($_POST) { 
    $fields = array(); 
    foreach($_POST as $col => $val) { 
     $fields[$col] = urlencode($val); 
    } 
    print_r($fields); 
    curl_setopt($chpg, CURLOPT_POST, count($fields)); 
    curl_setopt($chpg, CURLOPT_POSTDATA, $fields); 
} 

答えて

3

あなたはそこに問題のカップルがあります:

  1. CURLOPT_POSTDATACURLOPT_POSTFIELDSする必要があります。

  2. あなたは CURLOPT_POSTFIELDSとして$fieldsPHP配列を送っています。これは実際には の形式name1=value1&name2=value2&...の文字列である必要があります。これらの問題を解決するには

    次のように、あなたのPHPコードを変更します。

    if($_POST) { 
        $fields_str = http_build_query($_POST); 
    
        curl_setopt($chpg, CURLOPT_POST, count($_POST)); 
        curl_setopt($chpg, CURLOPT_POSTFIELDS, $fields_str); 
    } 
    

    Lawrence Cheroneが指摘したように、あなたがforeachループを捨て、代わりにhttp_build_queryを使用することができます。

+0

の代わりに、あなただけの '$ fields_str = http_build_query($ _ POST)' http://php.net/manual/enを行うことができ、foreachループを固定使用して、これを試してみてください/function.http-build-query.php –

+0

@LawrenceCherone:Ha、それは素晴らしいです。私はそれが存在することを気づかなかった!毎日何か新しいことを学ぶ。 :) – Xenon

+0

クエリでurlencodeも使用する必要がありますか?私はこのプロジェクトでHotmailにログインできないようです - 私の電子メールとパスは正しいと言われていますが、まだクエリが表示されており、それはうまくいきます。 – Anonymous

2

http_build_query &がCURLOPT_POSTFIELDS

$chpg = curl_init(); 
curl_setopt($chpg, CURLOPT_URL, $_URL); 
curl_setopt($chpg, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($chpg, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($chpg, CURLOPT_COOKIESESSION, true); 
curl_setopt($chpg, CURLOPT_COOKIEJAR, "cookies/$_COOKIE_FILE.$_DOMAIN.txt"); 
curl_setopt($chpg, CURLOPT_COOKIEFILE, "cookies/$_COOKIE_FILE.$_DOMAIN.txt"); 
if($_POST) { 
    curl_setopt($chpg, CURLOPT_POST, count($_POST)); 
    curl_setopt($chpg, CURLOPT_POSTFIELDS, http_build_query($_POST)); 
} 
関連する問題