Spring Boot 2.0.0.M 7でSwagger 2を使用してRESTful APIドキュメントを構築
29653 ワード
Spring BootでSwagger 2を使用して強力なRESTful APIドキュメントを構築
より多くの乾物 spring-bootシリーズ1のrestfull apiとマルチ環境構成 springbootシリーズ2のログ SpringBootシリーズ3のMVCモデルエンジン SpringBoot 2.0.0.M 7シリーズ四異常処理 springboot 2.0.0.M 7の注記と構成 springboot 2.0.0.M 7構成mvc springboot 2.0.0.M 7のサーブレットListener Filter springboot 2.0.0.M 7のドメイン間 springboot 2.0.0.M 7の使用mysql spring boot 2.0.0.M 7のデータベース-トランザクション springboot 2.0.0.M 7のh 2埋め込みデータベースの使用 springboot 2.0.0.M 7のデータベース-redis Spring Boot 2.0.0.M 7でSwagger 2を使用してRESTful APIドキュメントを構築する Spring Boot 2.0.0.M 7 springBoot-mongodb を使用 Spring Boot 2.0.0.M 7 Caching-EhCache を使用 Spring Boot spring boot Caching-Redis を使用 Spring Boot 2.0.0.M 7非同期メッセージサービス-AMQP(RabbitMQ) を使用 Spring Boot 2.0.0.M 7コールRESTサービス-プロキシ の使用方法 Spring Boot 2.0.0.M 7送信メール-テンプレートメールを使用してマルチアカウントポーリング送信 を実現 Spring Boot 2.0.0.M 7 Spring Sessionを使用してクラスタ-redis を実現 Spring Boot 2.0.0.M 7リモートデバッグ Spring Boot生産準備-HTTPに基づく監視 Spring Boot統合Druid springboot思考ガイド Spring Bootは、迅速な開発や導入が容易であるため、Spring Bootのユーザーの多くがRESTful APIの構築に使用されると信じています.RESTful APIを構築する目的は、通常、複数の最下位のビジネスロジックを共有するマルチ端末のためであるため、複数のモバイル端末またはWebフロントエンドに同時にサービスを提供する層を抽象化します.
に質問
これにより、我々のRESTful APIは、IOS開発、Android開発、Web開発など、複数の開発者または複数の開発チームに直面する可能性があります.通常、他のチームとの頻繁なコミュニケーションコストを削減するために、従来の方法では、すべてのインタフェースの詳細を記録するRESTful APIドキュメントを作成していますが、このような方法には次のような問題があります.インタフェースが多く、細部が複雑(異なるHTTPリクエストタイプ、HTTPヘッダ情報、HTTPリクエスト内容などを考慮する必要がある)ため、このドキュメントを高品質に作成すること自体が非常に骨が折れることで、下流の苦情が絶えない. 時間が経つにつれて、インタフェースの実装を絶えず修正するときは、インタフェースドキュメントを同期的に修正しなければならないが、ドキュメントとコードは2つの異なるメディアにあり、厳格な管理メカニズムがない限り、不一致現象 を招きやすい. Swagger 2は、Spring Bootに簡単に統合でき、Spring MVCプログラムと協力して強力なRESTful APIドキュメントを組織します.ドキュメントの作成作業量を削減し、説明内容を実装コードに統合し、ドキュメントのメンテナンスと修正コードを統合し、コードロジックを修正しながらドキュメントの説明を簡単に変更できます.また、Swagger 2は、各RESTful APIをデバッグする強力なページテスト機能も提供しています.
Swagger 2の構築
Swagger 2依存を追加
Swagger 2構成クラスの作成
Application.javaクラスでSwagger 2のコンフィギュレーションクラスSwagger 2を作成します.
ドキュメントの内容の追加
@ApiOperation注記でAPIに説明を追加し、@ApiImplicitParams、@ApiImplicitParam注記でパラメータに説明を追加
API詳細
さようはんい
API
使用場所
オブジェクトのプロパティ
@ApiModelProperty
出入りパラメータオブジェクトのフィールドに使用
プロトコルセットの説明
@Api
コントロールクラスでの使用
プロトコルの説明
@ApiOperation
コントロールの方法で
Responseセット
@ApiResponses
コントロールの方法で
Response
@ApiResponse
@ApiResponsesで使用
非オブジェクトパラメータセット
@ApiImplicitParams
コントロールの方法で
非オブジェクトパラメータの説明
@ApiImplicitParam
@ApiImplicitParamsの方法で
戻りオブジェクトの意味を説明
@ApiModel
戻りオブジェクトクラスで使用
@ApiImplicitParam paramTypeクエリーパラメータタイプ dataTypeパラメータのデータ型はフラグとしてのみ説明され、 は実際に検証されていない. name受信パラメータ名 value受信パラメータの意味説明 requiredパラメータが を入力する必要があるかどうか defaultValueデフォルト paramType例の詳細
queryパラメータと直接自動マッピング付与を完了
pathはアドレス形式でデータをコミットする
bodyはフロー形式で提出しPOSTのみをサポートする
ヘッダーパラメータはrequest headersに提出されます
Formフォーム形式で提出POSTのみサポート
アクセス
Spring Bootプログラムを起動し、アクセス:http://localhost:8081/swagger-ui.html
より多くの乾物
に質問
これにより、我々のRESTful APIは、IOS開発、Android開発、Web開発など、複数の開発者または複数の開発チームに直面する可能性があります.通常、他のチームとの頻繁なコミュニケーションコストを削減するために、従来の方法では、すべてのインタフェースの詳細を記録するRESTful APIドキュメントを作成していますが、このような方法には次のような問題があります.
Swagger 2の構築
Swagger 2依存を追加
<springfox-swagger2.version>2.2.2springfox-swagger2.version>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>${springfox-swagger2.version}version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>${springfox-swagger2.version}version>
dependency>
Swagger 2構成クラスの作成
Application.javaクラスでSwagger 2のコンフィギュレーションクラスSwagger 2を作成します.
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.cto.edu"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(" RESTful APIs")
.description(" http://111.231.142.109/")
.termsOfServiceUrl("http://localhost:8081/")
.contact("ctoDev")
.version("1.0")
.build();
}
}
ドキュメントの内容の追加
@ApiOperation注記でAPIに説明を追加し、@ApiImplicitParams、@ApiImplicitParam注記でパラメータに説明を追加
@RestController
@RequestMapping("/api/blog/topic")
public class BlogTopicController {
private static final Logger LOG = LoggerFactory.getLogger(BlogTopicController.class);
@Resource
private BlogTopicFacade blogTopicFacade;
@ApiOperation(value = " ", notes = " ")
@ApiImplicitParam(name = "obj", value = "{\"categoryIds\":[],\"number\":0,\"size\":1}", required = true, dataType = "JSONObject")
@SuppressWarnings("unchecked")
@PostMapping(value = "/findForPage")
public ViewerResult findForPage(@RequestBody JSONObject obj) {
ViewerResult result = new ViewerResult();
try {
List<String> categoryIds = (List<String>) obj.get("categoryIds");
int number = obj.getInteger("number");
int size = obj.getInteger("size");
Pageable page = PageRequest.of(number, size);
Searchable searchable = Searchable.newSearchable();
searchable.setPage(page);
if (categoryIds == null || categoryIds.isEmpty()) {
Page<BlogTopic> topicPage = blogTopicFacade.listPage(searchable);
result.setData(topicPage);
} else {
Page<BlogTopic> topicList = blogTopicFacade.findTopicByCategoryIds(categoryIds, page);
result.setData(topicList);
}
result.setSuccess(true);
} catch (Exception e) {
result.setSuccess(false);
result.setErrMessage(" ");
LOG.error(e.getMessage(), e);
}
return result;
}
@ApiOperation(value = " ", notes = " Id ")
@ApiImplicitParam(name = "obj", value = "{\"id\":\"1\"}", required = true, dataType = "JSONObject")
@PostMapping(value = "/findById")
public ViewerResult findById(@RequestBody JSONObject obj) {
ViewerResult result = new ViewerResult();
BlogTopic topic = null;
try {
String id = obj.getString("id");
topic = blogTopicFacade.getById(id);
result.setSuccess(true);
result.setData(topic);
} catch (Exception e) {
result.setSuccess(false);
result.setErrMessage(e.getMessage());
LOG.error(e.getMessage(), e);
}
return result;
}
}
API詳細
さようはんい
API
使用場所
オブジェクトのプロパティ
@ApiModelProperty
出入りパラメータオブジェクトのフィールドに使用
プロトコルセットの説明
@Api
コントロールクラスでの使用
プロトコルの説明
@ApiOperation
コントロールの方法で
Responseセット
@ApiResponses
コントロールの方法で
Response
@ApiResponse
@ApiResponsesで使用
非オブジェクトパラメータセット
@ApiImplicitParams
コントロールの方法で
非オブジェクトパラメータの説明
@ApiImplicitParam
@ApiImplicitParamsの方法で
戻りオブジェクトの意味を説明
@ApiModel
戻りオブジェクトクラスで使用
@ApiImplicitParam
queryパラメータと直接自動マッピング付与を完了
@GetMapping(value = "/sayParam")
@ApiOperation(value = " ", notes = " ")
@ApiImplicitParams({
@ApiImplicitParam(paramType = "query", name = "info", value = " ", dataType = "String")
})
@RequestParam(value = "info", required = false, defaultValue = " ") String myInfo
pathはアドレス形式でデータをコミットする
@RequestMapping(value = "/findById1/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@PathVariable(name = "id") Long id
bodyはフロー形式で提出しPOSTのみをサポートする
@ApiImplicitParams({ @ApiImplicitParam(paramType = "body", dataType = "MessageParam", name = "param", value = " ", required = true) })
@RequestMapping(value = "/findById3", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@RequestBody MessageParam param
json, , , ( @RequestBody )
ヘッダーパラメータはrequest headersに提出されます
@ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "Long", name = "id", value = " id", required = true) })
String idstr = request.getHeader("id");
if (StringUtils.isNumeric(idstr)) {
id = Long.parseLong(idstr);
}
Formフォーム形式で提出POSTのみサポート
@ApiImplicitParams({ @ApiImplicitParam(paramType = "form", dataType = "Long", name = "id", value = " id", required = true) })
@RequestMapping(value = "/findById5", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
アクセス
Spring Bootプログラムを起動し、アクセス:http://localhost:8081/swagger-ui.html