


Asp.net (2) Projet d'interface de traitement métier (Web Api)
Introduction
ApiEn tant que fournisseur de logique métier, il porte la logique de base du projet, il a donc une complexité logique relativement élevée. Dans un tel principe, comment simplifier l'écriture du code, comment standardiser et unifier le style d'écriture et les spécifications logiques, et comment améliorer la maintenabilité et l'évolutivité du code. Il devient important de construire des projets à forte cohésion et à faible couplage.
L'exemple est un projet au niveau de l'entreprise. Le framework est comme indiqué ci-dessous
api layer.jpg
Sécurité : La requête Http (Override DelegatingHandler) est réécrite, la validité de la requête est jugée et les exigences de signature sont prétraitées.
Client : définit une méthode d'appel interface unifiée qui est utilisée par l'extrémité appelante, simplifiant et unifiant l'utilisation de l'interface.
Couche Ctrl : en tant que fournisseur direct de services, il fournit directement une interface similaire au style RestFul sur le serveur (il semble de style RestFul strict, nécessitant un domaine complet ModèlePilote , la situation réelle est toujours insatisfaisante et la capacité d'abstraction du domaine n'est pas suffisante), obtenez les données de la demande, appelez FilterFilter si nécessaire, portez un jugement plus approfondi et appelez
Model.Couche : en tant que couche de modèle économique, elle assure le fonctionnement réel de la logique métier. Utilisez un modèle d'entité unifié et connectez-le à Ibatis pour les opérations de données.
La structure spécifique du code est la suivante :
Api-UML.jpg
Ce qui suit est une introduction détaillée de chaque module et exemple de code :
Exemple de code de projet de bibliothèque d'entités
La structure du projet est la suivante :
entité. jpg
Domain module, en tant que modèle d'entité, le code simple est le suivant
public class User { public int Id { get; set; } public string NickName { get; set; } public string Avatar { get; set; } }
Request, le modèle de structure de requête, utilise l'interface générique pour se connecter la classe de requête et la classe de retour, qui jouent un rôle Contrôler l'effet de l'inversion.
public abstract class AbstractRequest { public bool ValidateParameters() { //公用方法示例,验证参数合法性 } } public interface IRequest<T> where T:AbstractResponse { //获取接口名称 string GetApiName(); //获取接口编码 string GetApiCode(); } //获取User信息的请求结构定义 public class GetUserRequest:AbstractRequest,IRequest<GetUserResponse> { public int Id { get; set; } public string GetApiName() { return "User.GetUserDetail"; } public string GetApiCode() { return "User001"; } }
Le module de réponse, en tant que type de retour de la demande, définit une structure de retour unifiée pour permettre aux consommateurs de juger et de traiter la cohérence des codes de retour.
public abstract class AbstractResponse { //返回码 public int Code { get; set; } //报错信息 public string Message { get; set; } } public class GetUserResponse:AbstractResponse { public User User { get; set; } }
Exemple de code de projet de service
La structure du projet est la suivante :
service.jpg
Exemple de code :
public interface IUserService { GetUserResponse GetUser(int id); } public class BaseService { //protected SqlInstance sqlInstance; public BaseService() { //sqlInstance=new SqlInstance(); //实例化数据库连接 //... } //... } public class UserService:BaseService,IUserService { public GetUserResponse GetUser(int id) { //链接数据库获取数据 //... throw new NotImplementedException(); } }
SécuritéBibliothèque de classesExemple de code
La bibliothèque de classes ne gère que le problème de Sécurité au niveau de l'entrée de la requête API Ajoutez un jugement d’autorisation. Utilisez la méthode de réécriture des requêtes Http.
Exemple de code
public class MyHandler : DelegatingHandler { protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { IEnumerable<string> keyEnumerable; var t1 = request.Headers.TryGetValues("key", out keyEnumerable); var key = keyEnumerable.FirstOrDefault(); if (!true)//验证类似于token的权限 { return await Task.Factory.StartNew<HttpResponseMessage>( () => new HttpResponseMessage(HttpStatusCode.Forbidden) { Content = new StringContent("error message") }); } //如果有signature,判断,并加结果标志,没有的话,清除signature相关信息,防止伪造。 //..... return await base.SendAsync(request, cancellationToken); } }
Le jugement d'autorisation abstrait peut être directement appelé à la fin de la webapi et ajouté au code de configuration routage.
Exemple de projet WebApi
En tant que définition réelle de l'interface, webapi définit les règles réelles du fichier d'interface et effectue la gestion de la sécurité et le contrôle des autorisations correspondants de l'interface . Pour apprendre le contrôle des autorisations de WeChat, plusieurs interfaces ont été grossièrement déterminées :
Interface permissions.png
Les jugements de ces les autorisations sont toutes placées. La gestion centralisée se fait dans la sécurité. La définition de l'interface ne doit être utilisée que pour juger de la légalité de la logique correspondante.
Exemple de code :
public class UserController : ApiController { private IUserService userService; public UserController() { userService=new UserService(); } [Signature]//安全签名过滤器判断 [HttpPost] public GetUserResponse GetUser(GetUserRequest request) { //参数判断,安全性判断等等 var ret = userService.GetUser(request.Id); return ret; } }
Ce qui précède est un exemple d'interface pour obtenir des informations utilisateur. En tant que configuration de routage de l'entrée de l'interface, vous devez juger de la légalité de la demande. comme suit :
public static void Register(HttpConfiguration config) { // Web API configuration and services // Configure Web API to use only bearer token authentication. config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}", defaults: new { id = RouteParameter.Optional } ); //添加的代码,添加http请求的入口处理 config.MessageHandlers.Add(new MyHandler()); }
Exemple de code de bibliothèque de classes client
La bibliothèque de classes client définit les méthodes publiques appelées par l'interface.
1. Utilisez des interfaces génériques pour encapsuler la classe de requête et la classe de retour afin de simplifier l'écriture du code appelant.
2. Il permet également aux consommateurs d'appeler des interfaces via des classes proxy, évitant ainsi les problèmes inter-domaines.
3. Les appels des consommateurs acceptent tous d'utiliser une bibliothèque de classes unifiée, de sorte que le traitement des journaux soit unifié et que les erreurs renvoyées puissent également être définies de manière cohérente.
L'exemple de code est le suivant :
public interface IClient { T Execute<T>(IRequest<T> request) where T : AbstractResponse; } public class DefaultClient:IClient { private readonly string appKey; private readonly string appSecret; private readonly string baseUrl = "http://localhost:16469/api/"; private readonly bool isNeedLogFile = false; private readonly LogFile logFile; public static readonly string SecureHeaderAppKey = "secure_head_appkey"; public static readonly string SecureHeaderSignature = "secure_head_signature"; public DefaultClient() { baseUrl = ConfigurationManager.AppSettings["service_base_url"]; appKey = ConfigurationManager.AppSettings["app_key"]; appSecret = ConfigurationManager.AppSettings["app_secret"]; isNeedLogFile = "1".Equals(ConfigurationManager.AppSettings["client_log_file"]); logFile = new LogFile("client_log_path"); logFile.SubPath = appKey; } public DefaultClient(string serviceBase, string code, string key) { baseUrl = serviceBase; appKey = code; appSecret = key; } public T Execute<T>(IRequest<T> request) where T : AbstractResponse { var webRequest = (HttpWebRequest)WebRequest.Create(baseUrl + request.GetApiName()); webRequest.Method = "POST"; string reqJson; string sign; using (Stream rs = webRequest.GetRequestStream()) { reqJson = JsonConvert.SerializeObject(request); byte[] reqBytes = Encoding.UTF8.GetBytes(reqJson); rs.Write(reqBytes, 0, reqBytes.Length); rs.Close(); } webRequest.ContentType = "application/json"; webRequest.Headers.Add(SecureHeaderAppKey, appKey); sign = ComputeHash(appKey, appSecret, reqJson); webRequest.Headers.Add(SecureHeaderSignature, sign); //记录日志 if (isNeedLogFile) { logFile.Log(string.Format("[{0}] 请求内容: {1}", request.GetApiCode(), reqJson)); logFile.Log(string.Format("[{0}] 请求签名: {1}", request.GetApiCode(), sign)); } try { using (var resp = (HttpWebResponse)webRequest.GetResponse()) { try { Stream respStream = resp.GetResponseStream(); if (respStream == null) { throw new WebException("GetResponseStream returned null"); } var streamReader = new StreamReader(respStream); string respStr = streamReader.ReadToEnd(); //记录日志 if (isNeedLogFile) { logFile.Log(string.Format("[{0}] 响应内容: {1}", request.GetApiCode(), respStr)); } return JsonConvert.DeserializeObject<T>(respStr); } catch (Exception e) { //记录日志 if (isNeedLogFile) { logFile.Log(string.Format("[{0}] 响应错误: {1}", request.GetApiCode(), e.Message)); } throw new ApplicationException(e.Message, e); } } } catch (WebException e) { var errMsg = new StreamReader(e.Response.GetResponseStream()).ReadToEnd(); //记录日志 if (isNeedLogFile) { logFile.Log(string.Format("[{0}] 请求错误: {1}", request.GetApiCode(), errMsg)); } throw new APIServiceException(errMsg); } } private string ComputeHash(string key, string secret, string body) { return Convert.ToBase64String( SHA1.Create().ComputeHash(Encoding.Default.GetBytes(string.Concat(key, secret, body.Trim())))); } }
以上就是Api项目端的各个核心环节的详细介绍。
接下来会对调用端即前端进行简单的介绍。Asp.net(三)Web端展示
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





Lorsque nous assemblons l'ordinateur, bien que le processus d'installation soit simple, nous rencontrons souvent des problèmes de câblage. Souvent, les utilisateurs branchent par erreur la ligne d'alimentation du radiateur du processeur au SYS_FAN. Bien que le ventilateur puisse tourner, il peut ne pas fonctionner lorsque le ventilateur fonctionne. L'ordinateur est allumé. Il y aura une erreur F1 "CPUFanError", qui empêchera également le refroidisseur du processeur d'ajuster intelligemment la vitesse. Partageons les connaissances communes sur les interfaces CPU_FAN, SYS_FAN, CHA_FAN et CPU_OPT sur la carte mère de l'ordinateur. Science populaire sur les interfaces CPU_FAN, SYS_FAN, CHA_FAN et CPU_OPT sur la carte mère de l'ordinateur 1. CPU_FANCPU_FAN est une interface dédiée pour le radiateur du processeur et fonctionne à 12 V.

En tant que langage de programmation moderne et efficace, le langage Go possède de riches paradigmes de programmation et des modèles de conception qui peuvent aider les développeurs à écrire du code maintenable de haute qualité. Cet article présentera les paradigmes de programmation et les modèles de conception courants dans le langage Go et fournira des exemples de code spécifiques. 1. Programmation orientée objet Dans le langage Go, vous pouvez utiliser des structures et des méthodes pour implémenter une programmation orientée objet. En définissant une structure et des méthodes de liaison à la structure, les fonctionnalités orientées objet d'encapsulation de données et de liaison de comportement peuvent être obtenues. packagemaini

Introduction à l'interface PHP et à sa définition. PHP est un langage de script open source largement utilisé dans le développement Web. Il est flexible, simple et puissant. En PHP, une interface est un outil qui définit des méthodes communes entre plusieurs classes, réalisant le polymorphisme et rendant le code plus flexible et réutilisable. Cet article présentera le concept des interfaces PHP et comment les définir, et fournira des exemples de code spécifiques pour démontrer leur utilisation. 1. Concept d'interface PHP L'interface joue un rôle important dans la programmation orientée objet, définissant l'application de classe

La raison de l'erreur est en python. La raison pour laquelle NotImplementedError() est lancée dans Tornado peut être due au fait qu'une méthode ou une interface abstraite n'est pas implémentée. Ces méthodes ou interfaces sont déclarées dans la classe parent mais non implémentées dans la classe enfant. Les sous-classes doivent implémenter ces méthodes ou interfaces pour fonctionner correctement. Comment résoudre ce problème consiste à implémenter la méthode abstraite ou l'interface déclarée par la classe parent dans la classe enfant. Si vous utilisez une classe pour hériter d'une autre classe et que vous voyez cette erreur, vous devez implémenter toutes les méthodes abstraites déclarées dans la classe parent dans la classe enfant. Si vous utilisez une interface et que vous voyez cette erreur, vous devez implémenter toutes les méthodes déclarées dans l'interface dans la classe qui implémente l'interface. Si vous n'êtes pas sûr de savoir lequel

Les interfaces et les classes abstraites sont utilisées dans les modèles de conception pour le découplage et l'extensibilité. Les interfaces définissent les signatures des méthodes, les classes abstraites fournissent une implémentation partielle et les sous-classes doivent implémenter des méthodes non implémentées. Dans le modèle de stratégie, l'interface est utilisée pour définir l'algorithme, et la classe abstraite ou la classe concrète assure l'implémentation, permettant une commutation dynamique des algorithmes. Dans le modèle d'observateur, les interfaces sont utilisées pour définir le comportement de l'observateur, et les classes abstraites ou concrètes sont utilisées pour s'abonner et publier des notifications. Dans le modèle d'adaptateur, les interfaces sont utilisées pour adapter les classes existantes ou les classes concrètes peuvent implémenter des interfaces compatibles, permettant une interaction avec le code d'origine.

En tant que nouveau système d'exploitation lancé par Huawei, le système Hongmeng a fait sensation dans l'industrie. En tant que nouvelle tentative de Huawei après l'interdiction américaine, le système Hongmeng suscite de grands espoirs et attentes. Récemment, j'ai eu la chance d'acquérir un téléphone mobile Huawei équipé du système Hongmeng. Après une période d'utilisation et de tests réels, je partagerai quelques tests fonctionnels et une expérience d'utilisation du système Hongmeng. Tout d’abord, jetons un coup d’œil à l’interface et aux fonctions du système Hongmeng. Le système Hongmeng adopte le style de conception propre à Huawei dans son ensemble, qui est simple, clair et fluide. Sur le bureau, divers

Java permet de définir des classes internes au sein d'interfaces et de classes abstraites, offrant ainsi une flexibilité pour la réutilisation et la modularisation du code. Les classes internes des interfaces peuvent implémenter des fonctions spécifiques, tandis que les classes internes des classes abstraites peuvent définir des fonctions générales et les sous-classes fournissent des implémentations concrètes.

Interface : une interface de contrat sans implémentation définit un ensemble de signatures de méthodes en Java mais ne fournit aucune implémentation concrète. Il agit comme un contrat qui oblige les classes qui implémentent l'interface à implémenter ses méthodes spécifiées. Les méthodes de l'interface sont des méthodes abstraites et n'ont pas de corps de méthode. Exemple de code : publicinterfaceAnimal{voideat();voidsleep();} Classe abstraite : plan partiellement implémenté Une classe abstraite est une classe parent qui fournit une implémentation partielle dont ses sous-classes peuvent hériter. Contrairement aux interfaces, les classes abstraites peuvent contenir des implémentations concrètes et des méthodes abstraites. Les méthodes abstraites sont déclarées avec le mot-clé abstract et doivent être remplacées par des sous-classes. Exemple de code : publicabstractcla
