In diesem Artikel werden die besten Praktiken für Spring Boot zur Entwicklung von REST -Schnittstellen vorgestellt und sie wie folgt mit Ihnen teilt:
HTTP -Verben entsprechen SQL -Befehlen
ERHALTEN
Ressourcen vom Server erhalten, können Sie eine oder mehrere Ressourcen erhalten und alle Benutzerinformationen auf dem Server, GET /Benutzer /ID, die angegebene ID, und Benutzerinformationen der angegebenen ID erhalten.
POST
Erstellen Sie eine neue Ressource auf dem Server, die im Befehl CreatePost /Benutzer entspricht, um einen neuen Benutzer zu erstellen
SETZEN
Aktualisieren Sie eine Ressource auf dem Server, und der Client bietet die geänderte vollständige Ressource an, die dem Befehl updateput /user /id im SQL -Befehl entspricht, um alle Informationen des Benutzers mit der angegebenen ID zu aktualisieren
LÖSCHEN
Löschen Sie eine Ressource vom Server und löschen
Patch
Aktualisieren Sie einige Attribute einer Ressource auf dem Server, die im Befehl updatePatch /user /id entspricht, um ein bestimmtes Attribut des Benutzer mit der angegebenen ID zu aktualisieren
Konventionen in URLs
Substantive in URLs verwenden Pluralformen
Die Frage, ob der Name in einer URL einen Singular oder einen Plural verwendet, war umstritten. Die Substantive in der URL entsprechen im Allgemeinen Tabellen in der Datenbank, und die Tabellen speichern ähnliche Daten. In der Praxis erzwinge ich die Verwendung von Pluralformen, die komfortabler aussehen.
/Benutzer/Benutzer/1/Rollen/Rollen/Rollen/1
In einigen unregelmäßigen und unzähligen Substantiven hängt dies von Ihrer Meinung ab.
/Heroes/Heroes/1/Menschen/Menschen/1/Fuß/Fuß/1/Fuß/Fuß/1/Fuß/Fuß/1
Version
Sprechen Sie Versionsnummern, die zur URL hinzugefügt werden sollen, um mit inkompatiblen und destruktiven Änderungen umzugehen. Bei der Veröffentlichung einer neuen API kann der Kunde frei zur neuen API wechseln und wird nicht in Schwierigkeiten geraten, weil er eine völlig andere neue API aufgerufen hat. Verwenden Sie ein intuitives "V" -Prefix, um anzuzeigen, dass die folgende Nummer die Versionsnummer ist, keine sekundäre Versionsnummer erforderlich ist und API -Versionen nicht häufig veröffentlicht werden sollten.
/edu/v1/user/edu/v1/rollen
Verwenden Sie Abfragebräge für optionale, komplexe Parameter
Um die URL kleiner und prägnanter zu machen, legen Sie eine grundlegende URL für die Ressource fest, und optionale und komplexe Parameter werden durch Abfragebräge dargestellt.
/edu/v1/user? enabled = 1 & rolEID = 1
Geben Sie Paging -Informationen an
Es ist keine gute Idee, alle Ressourcen gleichzeitig in der Datenbank zurückzugeben, sodass ein Paging -Mechanismus erforderlich ist. Normalerweise werden die bekannten Parameter in der Datenbank verwendet, um auszugleichen und zu begrenzen
/edu/v1/user? enabled = 1 & offset = 1 & limit = 15
Wenn der Client diese Parameter nicht überträgt, sollte der Standardwert verwendet werden, normalerweise offset = 0, limit = 10.
Verwenden Sie Verben für Nicht-Ressourcenanfragen
Manchmal beinhalten API -Anrufe keine Ressourcen. In diesem Fall führt der Server einen Vorgang aus und gibt das Ergebnis an den Client zurück.
/edu/v1/calc? p = 100
Berücksichtigen Sie spezifische Ressourcen und Cross-Ressourcen-Suchvorgänge
Es ist einfach, eine Suche nach einem bestimmten Abstandsende zu bieten. Sie müssen nur die entsprechende Ressourcensammlung verwenden und die Suchzeichenfolge an die Abfrageparameter anhängen.
/edu/v1/user? userername = li qinghai
Wenn Sie eine globale Suche nach allen Ressourcen bereitstellen müssen, müssen Sie eine andere Methode anwenden.
/edu/v1/such? key = li qinghai
Antwortergebnisse
Verwenden Sie eine kleine Kamelnomenklatur als Attributkennung
In der Regel werden erholsame Webdienste von Clients verwendet, die in JavaScript geschrieben wurden. Der Client wandelt die JSON -Antwort in ein JavaScript -Objekt um und ruft dann seine Eigenschaften auf. Daher ist es am besten, den gemeinsamen Spezifikation des JavaScript -Codes zu befolgen.
Person.year_of_birth // Nicht empfohlen, verstößt gegen den JavaScript -Code Allgemeine Spezifikation Person.yearofbirth // Nicht empfohlen, JavaScript -Konstruktor mit dem Namen Person.yearofbirth // Empfohlen
Geben Sie Paging -Informationen an
Wenn viele Ergebnisse zurückgegeben werden, sollten Paging -Informationen bereitgestellt werden.
{"Seite": 0, "Größe": 10, "Gesamt": 3465, "obj": []}Frühlings -MVC -Entwicklungs -REST -Schnittstelle
Gemeinsame Anmerkungen
@Restcontroller
@RestController ist eine Kombination annotation von @ResponseBody und @Controller.
@RequestMapping
Diese Annotation kann auf eine Methode des Controllers oder auf diese Controller -Klasse angewendet werden. Wenn der Controller die @RequestMapping -Annotation auf Klassenebene hinzufügt, wird diese Annotation auf alle Prozessormethoden des Controllers angewendet. Die @RequestMapping -Annotation auf der Prozessormethode ergänzt die Erklärung von @RequestMapping auf Klassenebene.
@Postmapping
Die Kombinationsernotation ist die Abkürzung von @RequestMapping (method = requestMethod.post).
@Putmapping
Kombinationserannotation ist die Abkürzung von @RequestMapping (method = requestMethod.put).
@Patchmapping
Kombinationsernotation ist die Abkürzung von @RequestMapping (method = requestMethod.patch).
@Deletemapping
Die Kombinationsernotation ist die Abkürzung von @RequestMapping (method = requestMethod.delete).
@Getmapping
Kombinationsernotation ist die Abkürzung von @RequestMapping (method = requestMethod.get).
@PathVariable
Holen Sie sich die Daten in der URL.
@Requestparam
Ruft den Wert des angeforderten Parameters ab.
REST -Schnittstelle und Swagger -API -Dokumentation Beispiel
Für die Verwendung von Prahlerei finden Sie in der Verwendung von Swagger2 im Spring Boot -Projekt. Der Code in der Methodekörper ist nicht wichtig, was wichtig ist, ist die Signatur der Methode und die Zuordnung mit HTTP -Verben.
import Java.util.date; import Javax.Persistence.EntityNotFoundException; import org.springframework.bean.factory.Annotation.autowired; org.springframework.web.bind.annotation.patchmapping; import org.springframework.web.bind.Annotation.PathVariable; org. cn.com.infcn.jianshu.exception.bizexception; import cn.com.infcn.jianshu.exception.loginnameorpassworderrorexception; import cn.com.infcn.jianshu.Exception.resourceExistSexcept; cn.com.infcn.jianshu.util.jsonresult; import io.swagger.Annotations.api; import io.swagger.Annotations.apiparam;/** * Systembenutzercontroller * * @Author Li Qinghai * */ @api (Value = "System User Interface", Tags = "System" System "System" System "System" System "System" System "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "System", "Systems =" System "," System ". Management ")@rastController@requestmaping ("/v3/edu/user ") öffentliche Klasse UserController {@autowired private userservice userservice; /** * Add user, register * * @param loginName * Login account* @param userName * User name* @param password * Login password* @param roleId * User role* @return * @throws ResourceExistsException */ @ApiOperation(value = "Add user") @PostMapping("/") public JsonResult create( @ApiParam(name = "loginName", value = "Login account ", fordert = true) @RequestParam (erforderlich = true) @RequestBody String loginName, @APIPARAM (name =" username ", value =" userername ", fordert = true) @RequestParam (erforderlich = true) @RequestBody String username, @APIPARAM (name =", value = truy = "truy =", "truy" @"," Log in password ". Passwort, @APIPARAM (name = "rollenId", value = "Benutzerrollennummer", fordert = true) @RequestParam (fordert = true) @RequestBody String Rollen) löst ressourcenexistSexception {boolean exists = this.userService.Exists (LoginName); if (existiert) {neue ResourceExistSexception (LoginName) werfen; } User user = userService.create (LoginName, Kennwort, Benutzername, RollenID); return jsonResult.success (Benutzer); }/** * Benutzeranmeldung mit Login -Konto und Login -Kennwort * * @param LoginName * Login -Konto * @param Passwort * Login -Passwort * @throws enttityNotFoundException */@apioperation (Value = "-Anterabfrage -Benutzerinformationen basierend auf Benutzernummer") @getMapping ("/login") public JsonResult (| true) @RequestParam (fordert = true) String -LoginName, @APIPARAM (name = "password", value = "login password", fordert = true) @RequestParam (fordert = true) String Passwort) löst LoginNameOrPassWorderRorexception {user user = this.usersservice.login (loginNamePassWorderRorexce) aus. if (null == user) {werfen neuer loginNameorpassworderRorexception (); } return jsonResult.success (Benutzer); }/** * Benutzerinformationen basierend auf Benutzernummer * * @param id * Benutzernummer * @throws entityNotFoundException */@APIOPERATION (value = "Benutzerinformationen basierend auf der Benutzernummer") @getMapping ("/{{id}") public JSONRESULD LESELE. löst enttityNotFoundException {user user = this.userService.getone (ID) aus; return jsonResult.success (Benutzer); } /** * Account is cancelled, and the user's data is not deleted* * @param userId * User number* @return */ @ApiOperation(value = "Carded out of account") @PatchMapping("/{id}") public JsonResult cancel( @ApiParam(name = "id", value = "User number, primary key", required = true) @PathVariable(required = true) String id) throws EntityNotFoundException {this.userService.cancel (id); return jsonResult.success (); }/** * Kennwort zurücksetzen * * @param id * Benutzernummer * @param Passwort * Neues Login -Passwort * @return */@APIOPERATION (value = "Passwort zurücksetzen") @PatchMapping ("/") public JsonResult updatePassword (@APIPARAM (name = ", value =" @ @ @| "Passwort", value = "Neues Anmeldungskennwort", fordert = true) @RequestParam (erforderlich = True) String -Passwort) {this.userService.UpDatePassword (ID, Passwort); return jsonResult.success (); }/** * Multi-Condition-Kombination Query * * @param userername * Benutzername * @param rollen * Benutzerrolle * @param start * Startdatum * @param End * Enddatum * @param Seite * Pagination, beginnend mit 0 * @param Größe * Anzahl der Reihen pro Seite, Default 10 * @return * @whrows bizexception (@APICOPICED " @@APICOPICED (Value = uswows ( @throws bizexception public JsonResult -Abfrage (@APIPARAM (name = "userername", value = "Benutzername, Abfrage -Schlüsselwort", erforderlich = false) @RequestParam (erforderlich = Falsch) String -Benutzername, @APIPARAM (name = "rollen", value = "User Rollennummer", erforderlich) @RequestParam (FALSAL) STRING ROTRAIL, @APIPARAM ", @APIPIPARAM", @APIPIPARAM ", @APIPIPARAM", @APIPIPARAM ", @APIPARAM", @APIPARAM ", @APIPIPARAM" NAY ",", ", | Falsch) @RequestParam (erforderlich = Falsch) Datum Start, @apiparam (name = "end", value = "Benutzerrollennummer", erforderlich = false) @RequestParam (erforderlich = Falsch) Datum End, @APIPARAM (name = "page", value = "pagination, welche Page, @APIPARAM (name = "Größe", value = "Anzahl der Zeilen pro Seite, positive Integer", defaultValue = "10", erforderlich = true) @RequestParam (defaultValue = "10", erforderlich = true) int size) wirft bizexception ({user> datas). if (null == datas || null == datas.getContent () || datas.getContent (). isEmpty ()) {neue bizexception ("Benutzer existiert nicht"); } return jsonResult.success (datas); }}Swagger2 -Schnittstellendokument -Rendering
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.