web-dev-qa-db-ja.com

JSONとフォームPOST

RESTエンドポイントにデータをポストすることについて少し議論しています。オブジェクトは非常に複雑であるため、最も簡単な解決策は、JSONとしてシリアル化してこれを送信することです。リクエストボディ。

今問題はこれです:これはコーシャですか?または、JSONをdata = [JSON]のようなフォームパラメータとして設定する必要がありますか?または、アプリケーションを使用してクライアントにデータを送信するようにブラウザにパッケージ化させる代わりに、JavaScriptを使用してapplication/x-www-form-urlencoded

私は3つすべてのオプションworkを知っています。しかし[〜#〜] ok [〜#〜]はどれですか?または、少なくとも推奨

40
Johan Öbrink

どちらの方法もうまくいくと思いますが、API全体で一貫性を保つことが重要です。私が個人的に選択するオプションは、単にapplication/jsonとしてコンテンツを送信することです。

POSTを使用しても、application/x-www-form-urlencodedを使用する必要はありません。これは、Webブラウザーが使用するものであるため、よく使用されるものです。

27

シリアル化されたJSONとして直接送信することに問題はありません。たとえば、volleyライブラリのGoogleはデフォルトでこれを行います(明らかにが推奨されます) REST Android用ライブラリ)。

実際のところ、SO JSONの使い方しないについては多くの質問がありますが、「通常の」POSTリクエストを実行しますこれは基本クラスのgetParams()メソッドを上書きする必要があるため、初心者にとっては直感的ではありません。

しかし、それを持っているグーグルは独自のRESTライブラリがデフォルトでこれをやっている、それが[〜#〜] ok [〜#〜]

7
Levite

OPは3つのオプションがすべて機能することを述べたので、JSONを要求データの一部として使用できます。

OPは、複雑な構造コンテンツをサポートする必要があるため、JSON入力をサポートする必要があります。しかし、それをこのように考えてください...あなたは何かをするためのリクエストをしているのですか、それとも基本的にドキュメントデータであるものを送信しているだけですか? POST操作をcreate new entryと同等に使用するため。

そういうわけで、あなたが持っているのは基本的にはCRUDLセマンティクスを持つリソースエンドポイントです。その後のフォローアップは、実際にはapplication/jsonに限定されず、リソースエンドポイントが処理することになっている任意のタイプです。

非リソースエンドポイントの場合

(特にJAX-RSの場合)application/x-www-urlencodedの方が優れていることがわかりました。

  1. OAuth 2.0およびOpenID Connectとの整合性は、application/x-www-urlencodedを使用します。
  2. Swaggerアノテーションを使用して個々のフィールドに簡単にアノテーションを付ける
  3. Swaggerはより多くのデフォルトを提供します。
  4. Postmanは、ユーザーが入力するためのNiceフォームを生成し、テストを容易にします。

非リソースエンドポイントの例:

  • 認証
  • 認可
  • 単純な検索(ただし、この検索で​​はGETを使用します)
  • 多くの基準がある単純でない検索
  • メッセージ/ドキュメントの送信(コンテンツと一緒にメタデータを渡すことができるようにmultipart/form-dataも検討しますが、JAX-RSにはこの1つの標準がありません。JerseyとRestEasyには独自の実装があります)
5