Este artigo apresenta as melhores práticas para a Spring Boot para desenvolver interfaces de repouso e as compartilha com você, como segue:
Os verbos http correspondem aos comandos SQL
PEGAR
Obtenha recursos do servidor, você pode obter um ou mais recursos e obter todas as informações do usuário no servidor, obter /usuários /id, o ID especificado e obter informações do usuário do ID especificado.
PUBLICAR
Crie um novo recurso no servidor, correspondente ao CreateEpost /Usuários no comando SQL para criar um novo usuário
COLOCAR
Atualize um recurso no servidor e o cliente fornece o recurso completo alterado, correspondente ao Updateput /Usuários /ID no comando SQL para atualizar todas as informações do usuário com o ID especificado
EXCLUIR
Exclua um recurso do servidor e exclua as informações do usuário do ID especificado correspondente ao Deletedelete /Usuários /ID no comando SQL
CORREÇÃO
Atualize alguns atributos de um recurso no servidor, correspondendo ao UpdatePatch /Users /ID no comando sql para atualizar um determinado atributo do usuário com o ID especificado
Convenções em URLs
Substantivos em URLs usam formas plurais
A questão de saber se o nome em um URL usa um singular ou um plural tem sido controverso. Os substantivos na URL geralmente correspondem às tabelas no banco de dados e as tabelas armazenam dados semelhantes. Na prática, forço o uso de formas plurais, que parecem mais confortáveis.
/Usuários/Usuários/1/Funções/Funções/Funções/1
Quanto a alguns substantivos irregulares e incontáveis, depende da sua opinião.
/heróis/heróis/1/pessoas/pessoas/1/pé/pé/1/pés/pés/1/pés/pés/1
Versão
Fale os números da versão a serem adicionados ao URL para lidar com mudanças incompatíveis e destrutivas. Ao lançar uma nova API, o cliente pode passar para a nova API livremente e não estará em apuros por causa de uma nova API completamente diferente. Use um prefixo intuitivo "V" para indicar que o número a seguir é o número da versão, nenhum número de versão secundário é necessário e as versões da API não devem ser lançadas com frequência.
/EDU/V1/Usuários/EDU/V1/Funções
Use strings de consulta para parâmetros opcionais e complexos
Para tornar o URL menor e mais conciso, defina um URL básico para o recurso e os parâmetros opcionais e complexos são representados por seqüências de consultas.
/Edu/V1/Users? Habiled = 1 & RoleId = 1
Fornecer informações de paginação
Não é uma boa idéia retornar todos os recursos no banco de dados de uma só vez, portanto, é necessário um mecanismo de paginação. Geralmente, os parâmetros bem conhecidos no banco de dados são usados para compensar e limitar
/Edu/V1/Users? Habiled = 1 & Offset = 1 & Limit = 15
Se o cliente não passar esses parâmetros, o valor padrão deve ser usado, geralmente deslocamento = 0, limite = 10.
Use verbos para solicitações de não recursos
Às vezes, as chamadas da API não envolvem recursos; nesse caso, o servidor executa uma operação e retorna o resultado ao cliente.
/edu/v1/calc? p = 100
Considere recursos específicos e pesquisas de recursos cruzados
É fácil fornecer uma pesquisa por uma final de estadia específica. Você só precisa usar a coleção de recursos correspondente e anexar a sequência de pesquisa aos parâmetros de consulta.
/Edu/v1/usuários? Nome de usuário = li qinghai
Se você precisar fornecer uma pesquisa global para todos os recursos, precisará usar outro método.
/edu/v1/pesquisa? key = li qinghai
Resultados da resposta
Use a nomenclatura de camelo pequena como identificador de atributo
Normalmente, os serviços da Web RESTful serão usados por clientes escritos em JavaScript. O cliente converte a resposta JSON em um objeto JavaScript e depois chama suas propriedades. Portanto, é melhor seguir a especificação comum do código JavaScript.
Person.year_of_birth // não recomendado, violando o código Javascript Código Geral Specification Person.
Fornecer informações de paginação
Quando há muitos resultados retornados, as informações de paginação devem ser fornecidas.
{"Page": 0, "Tamanho": 10, "Total": 3465, "Obj": []}Interface de repouso de desenvolvimento de mvc spring
Anotações comuns
@Restcontroller
@RestController é uma anotação combinada de @ResponseBody e @Controller.
@RequestMapping
Esta anotação pode ser aplicada a um método do controlador ou a esta classe do controlador. Quando o controlador adiciona a anotação @RequestMapping no nível da classe, esta anotação é aplicada a todos os métodos do processador do controlador. A anotação @RequestMapping no método do processador complementará a declaração de @RequestMapping no nível da classe.
@PostMapping
Anotação de combinação é a abreviação de @RequestMapping (Method = requestMethod.post).
@PutMapping
Anotação de combinação é a abreviação de @RequestMapping (Method = requestMethod.put).
@Patchmapping
Anotação de combinação é a abreviação de @RequestMapping (Method = requestMethod.patch).
@DeleTemapping
Anotação de combinação é a abreviação de @RequestMapping (Method = requestMethod.Delete).
@GetMapping
Anotação de combinação é a abreviação de @RequestMapping (Method = requestMethod.get).
@Pathvariable
Obtenha os dados no URL.
@RequestParam
Obtém o valor do parâmetro solicitado.
Exemplo de documentação da interface e swagger da interface e swagger
Para o uso do Swagger, consulte o uso do Swagger2 no projeto de inicialização da primavera. O código no corpo do método não é importante, o importante é a assinatura do método e o mapeamento com os verbos HTTP.
importar java.util.date; importar javax.persistence.entityNotfoundException; importar org.springframework.beanS.factory.annotation.autowired; importar org.springframework.data.domain.page; importação.springframework.web.bind.bind.dind.antation.ank.annAng.annAntation; import.springframework.web.bind.bind.bring.annotation.annAng.annAng.ANTATION; org.springframework.web.bind.annotation.patchmapping; importar org.springframework.web.bind.annotation.pathvariable; importar org.springframework.web.bind.annotation.postMapping; importação Org.SPringFramwork.web.webind.bind.annotation.postMapping; importação. org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import cn.com.infcn.jianshu.Service.UserService;import cn.com.infcn.jianshu.exception.bizexception; importar cn.com.infcn.jianshu.exception.loginnameorpassworderRorexception; importar cn.com.infcn.jianshu.exception.resourcexistsexception; import cn.com.infcn.jianshu.exception.resourceExistsexception; import cn.com.infcn.jianshu.exception.resourceExistsexception; import cn.com.infcn.jianshu.exception.resourceExistsexception; importação; cn.com.infcn.jianshu.util.jsonResult; importar io.swagger.annotações.api; importar io.swagger.annotações.apiparam;/** * controlador do usuário do sistema * * @author li qinghai * */ @api (value " Gerenciamento ")@RestController@requestmapping ("/v3/edu/usuários ") classe pública UserController {@AUTOWIRED PRIVADO UserService UserService; /** * Adicionar usuário, registrar * * @param loginName * Login Account * @param nome de usuário * Nome do usuário * @Param Senha * Login Senha * @param Roleid * função do usuário * @return * @THOWSOWSEXISTEXEXCECCEMCCETION */@APIOPERATION (VALUE = "Add User") @PostMapping ("/") public JSONRSURSURT " conta ", requerir = true) @Apiparam @RequestBody String LoginName, @apiparam (name =" nome de usuário ", value =" nome de usuário ", requerido = true) @ReQuestParam (requery = true) @requestbody string username, @apiParam (names =" senha ", value =" Log = Log = Log na senha " senha, @apiparam (name = "roleid", value = "número da função do usuário", requerir = true) @RequestParam (requerir = true) @requestbody string roleid) lança ResourceExistSexception {boolean existe = this.UserService.Exists (loginName); if (existe) {lança novo ResourceExistSexception (loginName); } Usuário usuário = userservice.create (loginname, senha, nome de usuário, roleid); return jsonResult.success (usuário); }/** * Login do usuário na conta de login e na senha de login * * @param loginName * LOGIN CONTA * @PARAM Senha * Login Senha * @Throws entityNotFoundException */@apioperation (value (valuennamsult informações de usuário "@getin) @getMapping (NamenamnEnNennEMenNeM) (Namenam)). true) @RequestParam (requerido = true) String loginName, @apiparam (name = "senha", value = "senha de login", requerir = true) @RequestParam (requerir = true) string senha) lança loginNameRorMworderRorException {user user = this.userSerservie.Login (LoginName,); if (null == user) {lança new LoginNameRorpassworderRorexception (); } retornar jsonResult.success (usuário); }/** * Consulta as informações do usuário com base no número do usuário * * @param id * número do usuário * @throws entityNotFoundException */@apioperation (value = "Consulta Informações do usuário com base no número do usuário") @getMapping ("/{id}") public jsonResult read (@apiparam (name = "idi", valor = "", ") lança entityNotFoundException {usuário do usuário = this.userService.geneone (id); return jsonResult.success (usuário); }/** * A conta é cancelada e os dados do usuário não são excluídos * * @param userID * Número do usuário * @return */@apioperation (value = "cardado fora da conta") @PatchMapping ("/{id}") public jsonResult cancel (@apiPARAM (name = "idi", value = "") lança entityNotfoundException {this.userService.cancel (id); return jsonResult.success (); }/** * Redefinir senha * * @param id * número do usuário * @param senha * nova senha de login * @return */@apioperation (value = "redefinir senha") @patchMapping ("/") public jsonResult updatePassword (@apiparam (name = "id", número "número de usuário, key primário", exigido) "Senha", value = "nova senha de login", obrigatória = true) @RequestParam (requerir = true) senha da string) {this.userService.UpDatePassword (id, senha); return jsonResult.success (); }/** * Consulta de combinação de múltiplas condições * * @param nome de usuário * Nome do usuário * @param roleid * função do usuário * @param Iniciar * Data de início * @param final * data * @param página * paginação, a partir de 0 * @param size * número de linhas por página, default 10 * @return * @THizException */@ApiPl. JsonResult Query (@apiparam (name = "nome de usuário", value = "nome do usuário, palavra -chave de consulta", requerir = false) @requestParam (requerido = false) string userName, @apiparam (name = "role", valueid = "número do usuário", número requerido = false) @requestParam (exigir "role", roleid ", roleid =" usern, roleaip, @user (role ", role (role", roleid = "usuário do usuário"; @RequestParam (exigido = false) Iniciar, @apiparam (name = "end", value = "número da função do usuário", requerido = false) @RequestParam (requerido = false) Data final, @apiparam (name = "Page", value = "paginação, que página, iniciando de 1", defaultValue = "1", requerir =) @ @Apiparam (name = "size", value = "Número de linhas por página, número inteiro positivo", defaultValue = "10", requerir = true) @RequestParam (defaultValue = "10", requerir = true) size) lança Bizexception {Page <usuário> dats = this.UserService.indData (Page (Page <usuário> this.UserService.indData (Page (Page <usuário> this. if (null == dados || null == datas.getContent () || datas.getContent (). isEmpty ()) {throw new Bizexception ("Usuário não existe"); } retornar jsonResult.success (dados); }}Renderização de documentos da interface swagger2
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.