web-dev-qa-db-ja.com

x-www-form-urlencoded Vs json HTTP POST

決めるのは難しいです、
現在、データをx-www-form-urlencodedとしてphp libcurlで送信しています。

curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($this->arguments));

または

curl_setopt($curl, CURLOPT_POSTFIELDS, $this->arguments);

最初の質問: 2番目の質問はコンテンツの長さが長いようですが、最初の解決策の方がおそらく優れていますか?

次のようなフラットなメッセージには実用的です。

{
    "name": "John",
    "token": "2121232145",
    "code": "7",
    "data": "Hello"
}

しかし、オブジェクトを表すデータフィールドを持つこともできます。この場合はそれをエンコードしていましたが、それを行うと(JsonをエンコードするURL)、非常に冗長で醜いメッセージになります。

反対側では、application/jsoncontent-typeとして送信してみました

curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($this->arguments));

小さなメッセージの場合、コンテンツの長さは長くなりますが、jsonが埋め込まれているため、明らかに優れています。

しかし、x-www-form-urlencodedは、jsonが埋め込まれている場合を除いて、送信する必要のあるフォームデータにも近いです。

コンテンツタイプに応じて2つの異なるサーブレット解析メソッドを使用するのはエレガントではないので、別のオプションはありますか?

14
user1125394

ここ フォーマットに関する同様の議論を読むことができます。

エンコードされたデータの構造が名前と値のペアのフラットリストであることが保証されている場合は、x-www-form-urlencodedで十分と思われます。構造が(任意に)複雑になる可能性がある場合(たとえば、ネストリストや連想配列)、必ずJSONを使用してください。

私はKISS熟練しています。あなたの状況では、JSON/XML /時間、メモリ、CPUサイクルに余分なコストがかかります。x-www-form-urlencodedデータは読みやすさとコンパクトなので、あなたの選択だと思います。

13
pinepain

x-www-form-urlencodedとJSONは別物です。 x-www-form-urlencoded は、フォームをサーバーに送信するために使用される単なるデフォルトのコンテンツタイプですが、JSONは、構造化されたシリアル化と送信に使用されるテキストベースの人間が読める形式(標準)です。ネットワーク接続を介したデータ。それらを比較するべきではありません。

2つ目はコンテンツの長さが長いようですが、最初の解決策の方がおそらく優れていますか?

いいえ、「より良い」とラベル付けされたソリューションはありません。 pinepainが言ったように、それは実際に送信するデータの種類とそれを解析/処理する方法に依存します。 JSONは、リクエストとともに追加データを送信するのに最適です。

Content-lengthについては考えないでください。送信して処理するデータとデータ構造について考えてください。リクエスト間で構造化データを送信および処理するだけで、データサイズが異なる場合は、JSONを使用するだけです。これのために作られています。

アプリはFacebook、Twitter、またはGoogleのようなモンスターではないため、2つの方法のコンテンツの長さの違いは問題の一部ではありません。時期尚早の最適化はすべての悪の根源です。

9
edigu