Wählen Sie nur das Web unter https://start.spring.io/ aus und erstellen Sie es schnell
Ich hatte Swagger nicht und brachte es aus dem Maven Repository
Die Version usw. finden Sie unter build.gradle
.
Beispielcode https://github.com/ririkku/swagger-demo
build.gradle
plugins {
id 'org.springframework.boot' version '2.2.1.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
//Minimum für Swagger erforderlich
implementation "io.springfox:springfox-swagger2:2.9.2"
implementation "io.springfox:springfox-swagger-ui:2.9.2"
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
SwaggerDemoApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SwaggerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SwaggerDemoApplication.class, args);
}
}
SwaggerDemoConfiguration.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2 // swagger2.Verwenden Sie 0
public class SwaggerDemoConfiguration {
@Bean
public Docket petApi() {
return new Docket(DocumentationType.SWAGGER_2) // Swagger2.Erklärung zur Verwendung von 0
.select()
.paths(PathSelectors.ant("/apis/**"))
.build();
}
}
SwaggerDemoRestController.java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("apis")
public class SwaggerDemoRestController {
@GetMapping
public String get() {
return "get";
}
}
Normalerweise beginne ich mit Intellij IDEA, aber einige Leute sind nicht in dieser Umgebung, also beginne ich mit Gradle
./gradlew bootRun
Zugriff auf lokalen Host
http://localhost:8080/swagger-ui.html
(Da es nicht passte, wurde es in zwei Teile geteilt)
Benutzeroberfläche ist gut! !! !! Ich habe nicht viel Code geschrieben und es könnte praktisch sein Aber es fühlt sich viel Humor an, lassen Sie es uns ein wenig anpassen
SwaggerDemoConfiguration.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2 // swagger2.Verwenden Sie 0
public class SwaggerDemoConfiguration {
@Bean
public Docket petApi() {
return new Docket(DocumentationType.SWAGGER_2) // Swagger2.Erklärung zur Verwendung von 0
.select()
.paths(PathSelectors.ant("/apis/**"))
.build()
.apiInfo(new ApiInfoBuilder()
.title("Customise Title Swagger Demo Application")
.description("Ich habe es nach meinen Wünschen angepasst")
.contact(new Contact("customise-name", "http://customise-contact", "customise-email"))
.version("1.0")
.termsOfServiceUrl("http://customise.com")
.license("Customise License").licenseUrl("http://customise-license-url") //Text, wenn nur Lizenz, Link, wenn licenseUrl gesetzt ist
.build());
}
}
Die Stelle, an der das Suffix "Anpassen" neu geschrieben wurde Kann ich die Teile von "Basis-URL" und "http // localhost: 8080 / v2 / api-docs" ändern? Impressionen Außerdem können "Erweiterungen" in der "ApiInfoBuilder" -Klasse festgelegt werden Verwenden Sie es, wenn Sie Ihr eigenes Plug-In erstellen möchten? (https://swagger.io/docs/specification/2-0/swagger-extensions/) Nein, wie sieht die HTTP-Methode aus?
SwaggerDemoRestController.java
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("apis")
public class SwaggerDemoRestController {
@GetMapping
public String get() {
return "get";
}
@PostMapping
public void post() {
}
@DeleteMapping
public void delete() {
}
@PutMapping
public void put() {
}
@PatchMapping
public void patch() {
}
}
Ich habe GET vor einiger Zeit gesehen, also fühle ich mich das nächste Mal wie POST
Bunt und leicht zu sehen (PATCH oder so) Es scheint, dass die Details der API auf verschiedene Weise berücksichtigt werden (Statuscode usw.) Als nächstes passen wir die Details an
Ich habe es mir anders überlegt und eine neue Klasse gegründet Absichtlich ist "@ PathVariable" an eine Klasse und "@ RequestParam" an einen String gebunden!
Identifier.java
public class Identifier {
private String value;
public Identifier(String value) {
this.value = value;
}
public String value() {
if (value == null) return "";
return value;
}
}
SwaggerDemoCustomiseRestController.java
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("apis/customise")
public class SwaggerDemoCustomiseRestController {
@GetMapping("{identifier}")
public String detail(@RequestHeader("X-Customise-Header") String customiseHeader,
@PathVariable("identifier") Identifier identifier,
@RequestParam(value = "name", required = false) String name,
@RequestParam("limit") int limit) {
return identifier.value();
}
}
Ich habe versucht, "@ RequestHeader", "@ PathVariable", "@ RequestParam" zu setzen Obligatorische Dinge sind jetzt mit "erforderlich" gekennzeichnet, was praktisch ist.
Übrigens, wenn Sie auf die Schaltfläche "Ausprobieren" klicken, wird die folgende Anzeige angezeigt, und Sie können den Wert eingeben und überprüfen!
Durch Drücken von "Ausführen" werden "Curl", "URL anfordern", "ResponseCode", "ResponseBody", "ResponseHeaders" zurückgegeben!
Sieht ziemlich praktisch aus Als nächstes beschränken wir den willkürlich generierten Antwortstatus auf das, was Sie wollen
Durch Festlegen von "useDefaultResponseMessages" wird der Standardwert nur auf "200" gesetzt
SwaggerDemoConfiguration.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2 // swagger2.Verwenden Sie 0
public class SwaggerDemoConfiguration {
@Bean
public Docket petApi() {
return new Docket(DocumentationType.SWAGGER_2) // Swagger2.Erklärung zur Verwendung von 0
.select()
.paths(PathSelectors.ant("/apis/**"))
.build()
.useDefaultResponseMessages(false) // <-hinzufügen
.apiInfo(new ApiInfoBuilder()
.title("Customise Title Swagger Demo Application")
.description("Ich habe es nach meinen Wünschen angepasst")
.contact(new Contact("customise-name", "http://customise-contact", "customise-email"))
.version("1.0")
.termsOfServiceUrl("http://customise.com")
.license("Customise License").licenseUrl("http://customise-license-url") //Text, wenn nur Lizenz, Link, wenn licenseUrl gesetzt ist
.build());
}
}
Oshisuke verschwand Als nächstes definieren wir alle APIs der Fälle, die wahrscheinlich tatsächlich verwendet werden.
Ich möchte nur Swagger verwenden, damit der Verarbeitungsinhalt angemessen oder angemessen ist
LessonIdentifier.java
class LessonIdentifier {
private Integer value;
LessonIdentifier(String value) {
this.value = Integer.valueOf(value);
}
LessonIdentifier(int value) {
this.value = value;
}
Integer value() {
if (value == null) return 0;
return value;
}
}
LessonRequest.java
public class LessonRequest {
private String studentName;
private String tutorName;
public LessonRequest(String studentName, String tutorName) {
this.studentName = studentName;
this.tutorName = tutorName;
}
public String getStudentName() {
return studentName;
}
public String getTutorName() {
return tutorName;
}
}
LessonResponse.java
public class LessonResponse {
private int id;
private String studentName;
private String tutorName;
LessonResponse(int id, String studentName, String tutorName) {
this.id = id;
this.studentName = studentName;
this.tutorName = tutorName;
}
public int getId() {
return id;
}
public String getStudentName() {
return studentName;
}
public String getTutorName() {
return tutorName;
}
}
LessonIdentifierResponse.java
public class LessonIdentifierResponse {
private int value;
LessonIdentifierResponse(LessonIdentifier lessonIdentifier) {
this.value = lessonIdentifier.value();
}
public int getValue() {
return value;
}
}
ErrorResponse.java
public class ErrorResponse {
private String message;
public ErrorResponse(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
LessonController.java
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
@RestController
@RequestMapping("apis/lessons")
public class LessonController {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class)
@GetMapping
@ResponseStatus(HttpStatus.OK)
public List<LessonResponse> list() {
//Erwerbsprozess
return Arrays.asList(
new LessonResponse(1, "studentName1", "tutorName1"),
new LessonResponse(2, "studentName2", "tutorName2"),
new LessonResponse(3, "studentName3", "tutorName3"));
}
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@GetMapping("{lessonIdentifier}")
@ResponseStatus(HttpStatus.OK)
public LessonResponse detail(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
//Erwerbsprozess
return new LessonResponse(1, "studentName1", "tutorName1");
}
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public LessonIdentifierResponse add(@RequestBody LessonRequest lessonRequest) {
//Zusätzliche Bearbeitung
return new LessonIdentifierResponse(new LessonIdentifier(4));
}
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@DeleteMapping("{lessonIdentifier}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
//Prozess löschen
}
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@PutMapping("{lessonIdentifier}")
@ResponseStatus(HttpStatus.OK)
public LessonResponse edit(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier,
@RequestBody LessonRequest lessonRequest) {
//Bearbeitungsprozess
return new LessonResponse(1, "EditStudentName1", "EditTutorName1");
}
}
Es gibt viele, also nur einige
Example Value
kam gut heraus
Und nur die von ResponseStatus
angegebenen!
Ich bin an einem Punkt angelangt, an dem ich es gut nutzen kann Möchten Sie eine Erklärung der API schreiben? Also werde ich es schreiben
Ich habe versucht, "@ ApiOperation" hinzuzufügen
LessonController.java
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
@RestController
@RequestMapping("apis/lessons")
public class LessonController {
@ApiOperation(value = "Holen Sie sich eine Liste der Lektionen", notes = "Nehmen Sie alle Datensätze ohne Suchkriterien, um die Zeit in Ihrem Browser anzuhalten.")
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class)
@GetMapping
@ResponseStatus(HttpStatus.OK)
public List<LessonResponse> list() {
//Erwerbsprozess
return Arrays.asList(
new LessonResponse(1, "studentName1", "tutorName1"),
new LessonResponse(2, "studentName2", "tutorName2"),
new LessonResponse(3, "studentName3", "tutorName3"));
}
@ApiOperation(value = "Holen Sie sich eine Lektion", notes = "ID指定したHolen Sie sich eine Lektion")
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@GetMapping("{lessonIdentifier}")
@ResponseStatus(HttpStatus.OK)
public LessonResponse detail(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
//Erwerbsprozess
return new LessonResponse(1, "studentName1", "tutorName1");
}
@ApiOperation(value = "Erstellen Sie eine Lektion", notes = "Nach dem Erstellen wird die ID zurückgegeben!")
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public LessonIdentifierResponse add(@RequestBody LessonRequest lessonRequest) {
//Zusätzliche Bearbeitung
return new LessonIdentifierResponse(new LessonIdentifier(4));
}
@ApiOperation(value = "Lektion löschen", notes = "Ich werde nichts zurückgeben")
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@DeleteMapping("{lessonIdentifier}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
//Prozess löschen
}
@ApiOperation(value = "Lektion bearbeiten", notes = "Gibt die bearbeitete Lektion zurück!")
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@PutMapping("{lessonIdentifier}")
@ResponseStatus(HttpStatus.OK)
public LessonResponse edit(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier,
@RequestBody LessonRequest lessonRequest) {
//Bearbeitungsprozess
return new LessonResponse(1, "EditStudentName1", "EditTutorName1");
}
}
Details sind jetzt verfügbar!
Ich mag es jedoch nicht, wenn die in @ ApiOperation
oder @ ApiResponse
geschriebenen Nachrichten zu lang werden. .. ..
Ich werde es versuchen, indem ich mich frage, ob es in eine separate Datei umgewandelt werden kann
application.properties
LessonController.list.value=Holen Sie sich eine Liste der Lektionen
LessonController.list.notes=Stoppen Sie die Zeit in Ihrem Browser, indem Sie alle Datensätze ohne Suchkriterien aufnehmen
LessonController.detail.value=Holen Sie sich eine Lektion
LessonController.detail.notes=Holen Sie sich die Lektion mit der angegebenen ID
LessonController.add.value=Erstellen Sie eine Lektion
LessonController.add.notes=Nach dem Erstellen wird die ID zurückgegeben!
LessonController.delete.value=Lektion löschen
LessonController.delete.notes=Ich werde nichts zurückgeben
LessonController.edit.value=Lektion bearbeiten
LessonController.edit.notes=Gibt die bearbeitete Lektion zurück!
LessonController.java
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
@RestController
@RequestMapping("apis/lessons")
public class LessonController {
@ApiOperation(value = "${LessonController.list.value}", notes = "${LessonController.list.notes}")
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class)
@GetMapping
@ResponseStatus(HttpStatus.OK)
public List<LessonResponse> list() {
//Erwerbsprozess
return Arrays.asList(
new LessonResponse(1, "studentName1", "tutorName1"),
new LessonResponse(2, "studentName2", "tutorName2"),
new LessonResponse(3, "studentName3", "tutorName3"));
}
@ApiOperation(value = "${LessonController.detail.value}", notes = "${LessonController.detail.notes}")
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@GetMapping("{lessonIdentifier}")
@ResponseStatus(HttpStatus.OK)
public LessonResponse detail(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
//Erwerbsprozess
return new LessonResponse(1, "studentName1", "tutorName1");
}
@ApiOperation(value = "${LessonController.add.value}", notes = "${LessonController.add.notes}")
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public LessonIdentifierResponse add(@RequestBody LessonRequest lessonRequest) {
//Zusätzliche Bearbeitung
return new LessonIdentifierResponse(new LessonIdentifier(4));
}
@ApiOperation(value = "${LessonController.delelte.value}", notes = "${LessonController.delete.notes}")
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@DeleteMapping("{lessonIdentifier}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier) {
//Prozess löschen
}
@ApiOperation(value = "${LessonController.edit.value}", notes = "${LessonController.edit.notes}")
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
@ApiResponse(code = 404, message = "Not Found", response = ErrorResponse.class)})
@PutMapping("{lessonIdentifier}")
@ResponseStatus(HttpStatus.OK)
public LessonResponse edit(@PathVariable("lessonIdentifier") LessonIdentifier lessonIdentifier,
@RequestBody LessonRequest lessonRequest) {
//Bearbeitungsprozess
return new LessonResponse(1, "EditStudentName1", "EditTutorName1");
}
}
Lass uns ohne Probleme raus!
Dies ist sehr praktisch, wenn Sie Nachrichten in einer Datei kombinieren möchten Wenn Sie es jedoch nicht übertreiben, handelt es sich in der Regel um eine komplizierte Nachrichtendatei. Seien Sie also vorsichtig, wenn Sie sie verwenden.
Ich habe verstanden, dass es vorerst bequem zu sein scheint Es gibt jedoch einige Teile, die ich nicht untersuchen konnte, z. B. nach dem Erstellen oder wenn ich nicht möchte, dass die Produktionsumgebung auf swagger-ui zugreift, sodass ich später nachforschen werde.
https://springfox.github.io/springfox/docs/current/
Recommended Posts