この記事では、RESTインターフェイスを開発するためのSpring Bootのベストプラクティスを紹介し、次のようにそれらを共有します。
HTTP動詞はSQLコマンドに対応しています
得る
サーバーからリソースを取得すると、1つ以上のリソースを取得し、サーバー上のすべてのユーザー情報を取得し、指定されたIDを取得 /ユーザー /ID、指定されたIDのユーザー情報を取得できます。
役職
SQLコマンドのCreatePost /ユーザーに対応するサーバー上に新しいリソースを作成して、新しいユーザーを作成します
置く
サーバー上のリソースを更新すると、クライアントは、SQLコマンドの更新 /ユーザー /IDに対応する変更された完全なリソースを提供し、指定されたIDを使用してユーザーのすべての情報を更新します
消去
サーバーからリソースを削除し、SQLコマンドの削除 /ユーザー /IDに対応する指定されたIDのユーザー情報を削除します
パッチ
サーバー上のリソースのいくつかの属性を更新します。SQLコマンドのUpdatePatch /ユーザー /IDに対応して、指定されたIDを使用してユーザーの特定の属性を更新します
URLの慣習
URLの名詞は複数形式を使用します
URL内の名前が特異なものを使用しているのか複数を使用しているのかという問題は議論の余地があります。 URLの名詞は一般にデータベースのテーブルに対応し、テーブルは同様のデータを保存します。実際には、複数形の使用を強制します。これは、より快適に見えます。
/users/users/1/roles/roles/roles/1
不規則で数え切れない名詞に関しては、それはあなたの意見に依存します。
/ヒーロー/ヒーロー/1/人/人/1/フィート/1フィート/フィート/フィート/1/フィート/フィート/1
バージョン
互換性のない破壊的な変更に対処するために、URLに追加されるバージョン番号を話します。新しいAPIをリリースすると、クライアントは新しいAPIに自由に移動でき、まったく異なる新しいAPIを呼び出すために問題は発生しません。直感的な「V」プレフィックスを使用して、次の番号がバージョン番号、セカンダリバージョン番号が不要であり、APIバージョンを頻繁にリリースしないでください。
/EDU/V1/USERS/EDU/V1/ロール
オプションの複雑なパラメーターにはクエリ文字列を使用します
URLをより小さく簡潔にするために、リソースの基本的なURLを設定し、オプションのパラメーターと複雑なパラメーターがクエリ文字列で表されます。
/edu/v1/users?enabled = 1&roleId = 1
ページング情報を提供します
データベース内のすべてのリソースを一度に返すことをお勧めしないため、ページングメカニズムが必要です。通常、データベース内のよく知られているパラメーターは、オフセットおよび制限に使用されます
/edu/v1/users?enabled = 1&offset = 1&limit = 15
クライアントがこれらのパラメーターを渡さない場合、デフォルト値を使用する必要があります。通常はオフセット= 0、制限= 10です。
リソース以外の要求に動詞を使用します
API呼び出しにリソースが含まれない場合があります。その場合、サーバーは操作を実行し、結果をクライアントに返します。
/edu/v1/calc?p = 100
特定のリソースとクロスリソース検索を検討してください
特定の滞在の終わりを検索するのは簡単です。対応するリソースコレクションを使用して、検索文字列をクエリパラメーターに追加するだけです。
/edu/v1/users?username = li qinghai
すべてのリソースのグローバル検索を提供する必要がある場合は、別の方法を使用する必要があります。
/edu/v1/search?key = li qinghai
応答結果
属性識別子として小さなラクダの命名法を使用します
通常、Restful Webサービスは、JavaScriptで書かれたクライアントによって使用されます。クライアントはJSON応答をJavaScriptオブジェクトに変換し、そのプロパティを呼び出します。したがって、JavaScriptコード共通仕様に従うことが最善です。
perse.year_of_birth //推奨されていない、javascriptコード一般仕様person.yearofbirth //推奨されていない、javascript constructor neade person.yearofbirth //推奨
ページング情報を提供します
多くの結果が返されたら、ページング情報を提供する必要があります。
{"page":0、 "size":10、 "total":3465、 "obj":[]}スプリングMVC開発休憩インターフェイス
一般的な注釈
@RestController
@RestControllerは、@ResponseBodyと@Controllerの組み合わせアノテーションです。
@RequestMapping
この注釈は、コントローラーの方法またはこのコントローラークラスに適用できます。コントローラーがクラスレベルで@RequestMappingアノテーションを追加すると、この注釈はコントローラーのすべてのプロセッサメソッドに適用されます。プロセッサメソッドの@RequestMappingアノテーションは、クラスレベルでの@RequestMappingの宣言を補完します。
@PostMapping
併用注釈は、@RequestMappingの略語です(method = requestMethod.Post)。
@putmapping
併用注釈は、@RequestMappingの略語です(method = requestMethod.put)。
@PatchMapping
併用注釈は、@RequestMappingの略語です(method = requestMethod.patch)。
@deletemapping
併用注釈は、@RequestMappingの略語です(method = requestMethod.Delete)。
@getMapping
併用注釈は、@RequestMappingの略語です(method = requestMethod.get)。
@pathvariable
URLでデータを取得します。
@RequestParam
要求されたパラメーターの値を取得します。
RESTインターフェイスとSwagger APIドキュメントの例
Swaggerの使用については、Spring BootプロジェクトでのSwagger2の使用を参照してください。メソッド本体のコードは重要ではありません。重要なのは、メソッドの署名とHTTP動詞を使用したマッピングです。
java.util.date; Import javax.persistence.entitynotfoundexception; Import org.springframework.beans.factory.annotation.autowired; import org.springframework.data.domain.page; import org.springframework.web.bind.annotation.getmapping; org.springframework.web.bind.annotation.patchmapping; import org.springframework.web.bind.annotation.pathvariable; Import org.springframework.web.bind.annotation.postmapping; import org.springframework.web.bind.annotation.Requestody; org.springframework.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.restcontroller; Import cn.com.infcn.jianshu.serry.surrice.userservice; cn.com.infcn.jianshu.exception.bizexception; Import cn.com.infcn.jiansshu.exception.loginnameorpassworderRorexception; Import cn.com.infcn.jianshu.exception.resourceexistsecection; Import cn.com.infcn.jianshu.model.user; Import; cn.com.infcn.jianshu.util.jsonresult; import io.swagger.annotations.api; import io.swagher.annotations.apiparam;/** *システムユーザーコントローラー * * @author li qinghai * */@api(value = "system interface"、tags = "retccontrorer@edmapser class usercontroller {@autowired private userservice userservice; /** *登録、登録 * * @param loginname * login account * @param username * user name * @param password * @param roled * @return * @throws resourceexistsexception */@apioperation(value = "add user")@postmapping( "/"/" @apiparam" logiparam( "logiparam"、 "loginname" flogiparam create( "/")必須= true)@RequestParam(必須= true)@RequestBody文字列loginName、@Apiparam(name = "username"、value = "username"、exicew = true)@requestbody文字列username @apiparam(name = "roleId"、value = "ユーザーロール番号"、必須= true)@RequestBody string roleid)throws resourceExistSexcection {boolean exists = this.userservice.exists(loginname); if(exists){新しいResourceExistSexcection(loginname); } user user = userservice.create(loginname、password、username、roleid); jsonresult.success(user); }/** *ユーザーログインアカウントとログインパスワードでログイン * * @param loginname * @param password * @param password * @throws entitynotfoundexception */@apioperation(value = "ユーザー番号に基づくクエリユーザー情報")@getmapping( "/login")public jsonult login(@apiparam( "login(" login) "login(" login)fulgin) @RequestParam(必須= true)文字列loginname、@apiparam(name = "password"、value = "login password"、exicew = true)@RequestParam(必須= true)文字列パスワード)スローloginnameorpassworderRorexception {ユーザーユーザー= this.userservice.login(loginname、loginname、loginname); if(null == user){新しいloginnameorpassworderrorexception(); } jsonresult.success(user); }/** *ユーザー番号に基づくユーザー情報のクエリ * * @param ID *ユーザー番号 * @Throws EntityNotFoundException */@Apioperation(value = "ユーザー番号に基づくクエリユーザー情報")@getMapping( "/{id}")public jsonresult read(@apiparam(name = "id" = falue = prut id sint " entityNotFoundException {user user = this.userservice.getone(id); jsonresult.success(user); }/** *アカウントがキャンセルされ、ユーザーのデータは削除されていませんentityNotFoundException {this.userservice.cancel(id); jsonresult.success()を返します。 }/** *パスワードのリセット * * @param id *ユーザー番号 * @paramパスワード *新しいログインパスワード * @return */@apioperation(value = "reset password")@patchmapping( "/")public jsonresult upduttPassword(@Apiparam(name = "id"、value = "user number、primer key)= true = true id、@requestparam( 「パスワード」、value =「新しいログインパスワード」、必須= true)@RequestParam(必須= true)文字列パスワード){this.userservice.updatePassword(id、password); jsonresult.success()を返します。 }/** *マルチコンディションの組み合わせクエリ * * @param username * user name * @param roled * @param bole * @param start * start date * @param end * @param page * pagination * @param size * @param size * per per per per per per per、default10 * @return * @throws bizexception */@apioperation( @apioperation( "/" use "use" use oper ") jsonresult query(@apiparam(name = "username"、value = "user name、query keyword"、require = false)@requestparam(exiclid = false)string username、@apiparam(name = "roleId"、value = "ユーザーロール番号"、必須= false)@requestparam(必須= false @RequestParam(必須= false)日付開始、@apiparam(name = "end"、value = "ユーザーロール番号"、必須= false)@RequestParam(false = false)日付end、@Apiparam(name = "page"、value = "pagination、pagination、page、from 1"、defaultValue = "1 @apiparam(name = "size"、value = "ページあたりの行数、ポジティブ整数"、defaultValue = "10"、必須= true)@RequestParam(defaultValue = "10"、必須= true)bizexception {page <user> datas = this.userservice.finddatas if(null == datas || null == datas.getContent()|| datas.getContent()。isempty()){throw new bizexception( "ユーザーは存在しません"); } jsonresult.success(datas)を返します。 }}Swagger2インターフェイスドキュメントレンダリング
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。