外部の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);
あなたの質問に対する一般的な答えは、それが依存するということです。また、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の時点で、ファイルが@プレフィックス付きでこのオプションに渡される場合、値は配列でなければなりません。
@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ヘッダーと本文を使用します。
上記の投稿は、URLエンコードとその仕組みに関連する質問に答えていますが、元の質問は「POSTデータをURLエンコードする必要がありますか?」でした。答えられません。
URLエンコーディングの最近の経験から、質問をさらに拡張したいと思います。 「GET HTTPメソッドと同じPOSTデータをURLエンコードする必要があります。一般的に、ブラウザ上のHTMLフォームに情報が入力、送信、または取得されると、ブラウザはURLエンコードを行いますが、アプリケーションが公開する場合Webサービスであり、消費者がデータに対してURLエンコードを行うことを期待していますが、POST HTTPメソッドでURLエンコードを行うことはアーキテクチャ上および技術的に正しいですか? "
curlはデータをエンコードします。生のフィールドデータをfields配列にドロップし、「go」と伝えるだけです。