web-dev-qa-db-ja.com

POSTデータをURLエンコードする必要がありますか?

外部のAPIにデータをPOSTします(関連する場合はPHPを使用)。

渡すPOST変数をURLエンコードする必要がありますか?

または、GETデータのURLエンコードのみが必要ですか?

ありがとう!

更新:関連する場合、これは私のPHPです。

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
    'datetime'=>urlencode($_POST["datetime"]),
    'category'=>urlencode($_POST["category"]),
    'metacategory'=>urlencode($_POST["metacategory"]),
    'caption'=>($_POST["description"])
);
$fields_string = http_build_query($fields);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
116
Richard

一般的な回答

あなたの質問に対する一般的な答えは、それが依存するということです。また、HTTPヘッダーに「Content-Type」が何であるかを指定することで決定できます。

「application/x-www-form-urlencoded」の値は、POST本文をGETパラメーター文字列のようにURLエンコードする必要があることを意味します。 「multipart/form-data」の値は、コンテンツの区切り文字を使用し、コンテンツをURLエンコードしないことを意味します。

この回答には、より詳細な説明があります 詳細情報が必要な場合。


具体的な回答

使用しているPHPライブラリに固有の回答(CURL)については、 こちらのドキュメントを読んでください にしてください。

関連情報は次のとおりです。

CURLOPT_POST

通常のHTTP POSTを実行する場合はTRUE。このPOSTは、通常のapplication/x-www-form-urlencodedの種類で、HTMLフォームで最も一般的に使用されます。

CURLOPT_POSTFIELDS

HTTP "POST"操作で投稿する完全なデータ。ファイルを送信するには、ファイル名の前に@を付けてフルパスを使用します。ファイルタイプは、ファイル名の後に「; type = mimetype」形式のタイプで明示的に指定できます。このパラメーターは、 'para1 = val1&para2 = val2&...'のようなurlencoded文字列として、またはフィールド名をキーとして、フィールドデータを値として持つ配列として渡すことができます。値が配列の場合、Content-Typeヘッダーはmultipart/form-dataに設定されます。 PHP 5.2.0の時点で、ファイルが@プレフィックス付きでこのオプションに渡される場合、値は配列でなければなりません。

128
DougW

@DougWはこの質問に明確に回答しましたが、Dougのポイントを説明するコードをここに追加したいです。 (上記のコードのエラーを修正してください)

解決策1:コンテンツタイプヘッダー:application/x-www-form-urlencodedを使用してPOSTデータをURLエンコードします。

注:$ _POST []フィールドを1つずつurlencodeする必要はありません。http_build_query()関数はurlencodingジョブをうまく実行できます。

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>$_POST["username"],
    'password'=>$_POST["password"],
    'latitude'=>$_POST["latitude"],
    'longitude'=>$_POST["longitude"],
    'datetime'=>$_POST["datetime"],
    'category'=>$_POST["category"],
    'metacategory'=>$_POST["metacategory"],
    'caption'=>$_POST["description"]
);

$fields_string = http_build_query($fields);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);

解決策2:Content-Typeヘッダーがmultipart/form-dataに設定されている間に、配列をURLエンコードなしで投稿データとして直接渡します。

$fields = array(
        'mediaupload'=>$file_field,
        'username'=>$_POST["username"],
        'password'=>$_POST["password"],
        'latitude'=>$_POST["latitude"],
        'longitude'=>$_POST["longitude"],
        'datetime'=>$_POST["datetime"],
        'category'=>$_POST["category"],
        'metacategory'=>$_POST["metacategory"],
        'caption'=>$_POST["description"]
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);

両方のコードスニペットは機能しますが、異なるHTTPヘッダーと本文を使用します。

9
skyfree

上記の投稿は、URLエンコードとその仕組みに関連する質問に答えていますが、元の質問は「POSTデータをURLエンコードする必要がありますか?」でした。答えられません。

URLエンコーディングの最近の経験から、質問をさらに拡張したいと思います。 「GET HTTPメソッドと同じPOSTデータをURLエンコードする必要があります。一般的に、ブラウザ上のHTMLフォームに情報が入力、送信、または取得されると、ブラウザはURLエンコードを行いますが、アプリケーションが公開する場合Webサービスであり、消費者がデータに対してURLエンコードを行うことを期待していますが、POST HTTPメソッドでURLエンコードを行うことはアーキテクチャ上および技術的に正しいですか? "

2
Varun

curlはデータをエンコードします。生のフィールドデータをfields配列にドロップし、「go」と伝えるだけです。

2
user340140