Inhaltsverzeichnis
Einführung
Entitätsbibliotheksprojektcodebeispiel
Die Projektstruktur ist wie folgt:
Die Klassenbibliothek behandelt nur das Problem " >CodebeispielDie Klassenbibliothek behandelt nur das Problem
Als eigentliche Definition der Schnittstelle definiert Webapi die tatsächlichen Regeln der Schnittstellendatei und führt die entsprechende
Die Client-Klassenbibliothek definiert die von der Schnittstelle aufgerufenen öffentlichen Methoden.
Heim Backend-Entwicklung C#.Net-Tutorial Asp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API)

Asp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API)

Apr 04, 2017 pm 03:32 PM
asp.net web api 接口

Einführung

ApiAls Anbieter von Geschäftslogik trägt es die Kernlogik des Projekts und weist daher eine relativ hohe Logikkomplexität auf. Unter einer solchen Prämisse geht es darum, wie man das Schreiben von Code vereinfacht, wie man den Schreibstil und die Logikspezifikationen standardisiert und vereinheitlicht und wie man die Wartbarkeit und Skalierbarkeit des Codes verbessert. Es wird wichtig, Projekte mit hoher Kohäsion und geringer Kopplung aufzubauen.
Das Beispiel ist ein Projekt auf Unternehmensebene. Das Framework ist wie unten gezeigt

Asp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API)

api layer.jpg

Sicherheit: Die HTTP-Anfrage (Override DelegatingHandler) wird neu geschrieben, die Rechtmäßigkeit wird in den Aspekten der Anfrage beurteilt und die Signaturanforderungen werden vorverarbeitet.
Client: Definiert eine einheitliche Schnittstelle-Aufrufmethode, die vom aufrufenden Ende verwendet wird, wodurch die Verwendung der Schnittstelle vereinfacht und vereinheitlicht wird.
Strg-Ebene: Als direkter Anbieter von Diensten stellt er direkt eine dem RestFul-Stil ähnliche Schnittstelle auf dem Server bereit (es fühlt sich streng im RestFul-Stil an, der ein vollständiges Domänen-ModellTreiber , die tatsächliche Situation ist immer unbefriedigend und die Domänenabstraktionsfähigkeit reicht nicht aus), rufen Sie die Anforderungsdaten ab, rufen Sie nach Bedarf FilterFilter auf, treffen Sie weitere Beurteilungen und rufen Sie
Modell Schicht: Als Geschäftsmodellschicht stellt sie den eigentlichen Betrieb der Geschäftslogik bereit. Verwenden Sie ein einheitliches Entitätsmodell und verbinden Sie es für Datenoperationen mit Ibatis. Die spezifische Codestruktur ist wie folgt:

Asp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API)
Api-UML.jpg

Das Folgende ist eine detaillierte Einführung von jedes Modul und Codebeispiel:

Entitätsbibliotheksprojektcodebeispiel

Die Projektstruktur ist wie folgt:

Asp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API)
Entität. jpg

Do

main

Modul, als Entitätsmodell lautet der einfache Code wie folgt

Request, das Anforderungsstrukturmodell, verwendet die generische Schnittstelle zum Herstellen einer Verbindung Die Anforderungsklasse und die Rückgabeklasse, die eine Rolle spielen, steuern den Effekt der Inversion.
public class User
{
      public int Id { get; set; }
      public string NickName { get; set; }
      public string Avatar { get; set; }
}
Nach dem Login kopieren

Das Antwortmodul definiert als Rückgabetyp der Anfrage eine einheitliche Rückgabestruktur, um Verbrauchern die Beurteilung und Verarbeitung konsistenter Rückgabecodes zu erleichtern.
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";
        }
    }
Nach dem Login kopieren

Codebeispiel für ein Serviceprojekt
public abstract class AbstractResponse
    {
        //返回码
        public int Code { get; set; }
        //报错信息
        public string Message { get; set; }
    }
 public class GetUserResponse:AbstractResponse
    {
        public User User { get; set; }
    }
Nach dem Login kopieren
Die Projektstruktur ist wie folgt:

Asp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API)
service.jpg

Codebeispiel:

Sicherheit
 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();
        }
    }
Nach dem Login kopieren
Klassenbibliothek
CodebeispielDie Klassenbibliothek behandelt nur das Problem
Sicherheit

beim API-Anfrageeintrag Erlaubnisurteil hinzufügen. Verwenden Sie die Methode zum Umschreiben von HTTP-Anfragen. Codebeispiel

Das abstrahierte Berechtigungsurteil kann direkt am Webapi-Ende aufgerufen und dem
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);
        }
    }
Nach dem Login kopieren
Routing

-Konfigurationscode hinzugefügt werden. WebApi-Projektbeispiel

Als eigentliche Definition der Schnittstelle definiert Webapi die tatsächlichen Regeln der Schnittstellendatei und führt die entsprechende
Sicherheitsverwaltung

und Berechtigungskontrolle der Schnittstelle durch . Um die Berechtigungssteuerung von WeChat zu erlernen, wurden mehrere Schnittstellen grob bestimmt:

Asp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API)
Schnittstellenberechtigungen.png

Die Beurteilungen dieser Alle Berechtigungen werden platziert. Die zentrale Verwaltung erfolgt in der Sicherheit. Die Schnittstellendefinition muss nur verwendet werden, um die Rechtmäßigkeit der entsprechenden Logik zu beurteilen.

Codebeispiel:

Das Obige ist eine Beispielschnittstelle zum Abrufen von Benutzerinformationen. Als Routing-Konfiguration des Schnittstelleneingangs müssen Sie die Rechtmäßigkeit der Anforderung beurteilen wie folgt:
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;
        }

    }
Nach dem Login kopieren

Codebeispiel für die Client-Klassenbibliothek
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());
}
Nach dem Login kopieren
Die Client-Klassenbibliothek definiert die von der Schnittstelle aufgerufenen öffentlichen Methoden.
1. Verwenden Sie generische Schnittstellen, um die Anforderungsklasse und die Rückgabeklasse zu kapseln, um das Schreiben des aufrufenden Codes zu vereinfachen.

2. Es ermöglicht Verbrauchern auch, Schnittstellen über Proxy-Klassen aufzurufen, wodurch domänenübergreifende Probleme vermieden werden.
3. Alle Verbraucheraufrufe stimmen der Verwendung einer einheitlichen Klassenbibliothek zu, sodass die Protokollverarbeitung einheitlich ist und auch die zurückgegebenen Fehler konsistent definiert werden können.
Das Codebeispiel lautet wie folgt:

 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()))));
        }
    }
Nach dem Login kopieren

以上就是Api项目端的各个核心环节的详细介绍。
接下来会对调用端即前端进行简单的介绍。Asp.net(三)Web端展示

Das obige ist der detaillierte Inhalt vonAsp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1670
14
PHP-Tutorial
1276
29
C#-Tutorial
1256
24
Was sind die internen Schnittstellen eines Computer-Motherboards? Empfohlene Einführung in die internen Schnittstellen eines Computer-Motherboards Was sind die internen Schnittstellen eines Computer-Motherboards? Empfohlene Einführung in die internen Schnittstellen eines Computer-Motherboards Mar 12, 2024 pm 04:34 PM

Obwohl der Installationsprozess einfach ist, stoßen Benutzer beim Zusammenbau des Computers häufig auf Probleme mit der Verkabelung. Obwohl sich der Lüfter drehen kann, funktioniert er beim Booten möglicherweise nicht. Es kommt zu einem F1-Fehler „CPUFanError“, der auch dazu führt, dass der CPU-Kühler die Geschwindigkeit nicht intelligent anpassen kann. Lassen Sie uns das allgemeine Wissen über die Schnittstellen CPU_FAN, SYS_FAN, CHA_FAN und CPU_OPT auf der Hauptplatine des Computers teilen. Populäre Wissenschaft über die Schnittstellen CPU_FAN, SYS_FAN, CHA_FAN und CPU_OPT auf der Hauptplatine des Computers 1. CPU_FANCPU_FAN ist eine dedizierte Schnittstelle für den CPU-Kühler und arbeitet mit 12 V

Gängige Programmierparadigmen und Entwurfsmuster in der Go-Sprache Gängige Programmierparadigmen und Entwurfsmuster in der Go-Sprache Mar 04, 2024 pm 06:06 PM

Als moderne und effiziente Programmiersprache verfügt die Go-Sprache über umfangreiche Programmierparadigmen und Entwurfsmuster, die Entwicklern beim Schreiben von qualitativ hochwertigem, wartbarem Code helfen können. In diesem Artikel werden gängige Programmierparadigmen und Entwurfsmuster in der Go-Sprache vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Objektorientierte Programmierung In der Go-Sprache können Sie Strukturen und Methoden verwenden, um objektorientierte Programmierung zu implementieren. Durch die Definition einer Struktur und das Binden von Methoden an die Struktur können die objektorientierten Funktionen der Datenkapselung und Verhaltensbindung erreicht werden. Paketmaini

Einführung in PHP-Schnittstellen und deren Definition Einführung in PHP-Schnittstellen und deren Definition Mar 23, 2024 am 09:00 AM

Einführung in die PHP-Schnittstelle und wie sie definiert ist. PHP ist eine in der Webentwicklung weit verbreitete Open-Source-Skriptsprache. Sie ist flexibel, einfach und leistungsstark. In PHP ist eine Schnittstelle ein Werkzeug, das gemeinsame Methoden zwischen mehreren Klassen definiert, um Polymorphismus zu erreichen und Code flexibler und wiederverwendbar zu machen. In diesem Artikel werden das Konzept von PHP-Schnittstellen und deren Definition vorgestellt und spezifische Codebeispiele zur Veranschaulichung ihrer Verwendung bereitgestellt. 1. PHP-Schnittstellenkonzept Die Schnittstelle spielt eine wichtige Rolle in der objektorientierten Programmierung und definiert die Klassenanwendung

Lösung für NotImplementedError() Lösung für NotImplementedError() Mar 01, 2024 pm 03:10 PM

Der Grund für den Fehler liegt in Python. Der Grund, warum NotImplementedError() in Tornado ausgelöst wird, kann darin liegen, dass eine abstrakte Methode oder Schnittstelle nicht implementiert ist. Diese Methoden oder Schnittstellen werden in der übergeordneten Klasse deklariert, aber nicht in der untergeordneten Klasse implementiert. Unterklassen müssen diese Methoden oder Schnittstellen implementieren, um ordnungsgemäß zu funktionieren. Die Lösung dieses Problems besteht darin, die von der übergeordneten Klasse deklarierte abstrakte Methode oder Schnittstelle in der untergeordneten Klasse zu implementieren. Wenn Sie eine Klasse verwenden, um von einer anderen Klasse zu erben, und dieser Fehler angezeigt wird, sollten Sie alle in der übergeordneten Klasse deklarierten abstrakten Methoden in der untergeordneten Klasse implementieren. Wenn Sie eine Schnittstelle verwenden und dieser Fehler angezeigt wird, sollten Sie alle in der Schnittstelle deklarierten Methoden in der Klasse implementieren, die die Schnittstelle implementiert. Wenn Sie sich nicht sicher sind, welches

Anwendung von Schnittstellen und abstrakten Klassen in Entwurfsmustern in Java Anwendung von Schnittstellen und abstrakten Klassen in Entwurfsmustern in Java May 01, 2024 pm 06:33 PM

Schnittstellen und abstrakte Klassen werden in Entwurfsmustern zur Entkopplung und Erweiterbarkeit verwendet. Schnittstellen definieren Methodensignaturen, abstrakte Klassen stellen eine teilweise Implementierung bereit und Unterklassen müssen nicht implementierte Methoden implementieren. Im Strategiemuster wird die Schnittstelle zum Definieren des Algorithmus verwendet, und die abstrakte Klasse oder konkrete Klasse stellt die Implementierung bereit, wodurch ein dynamischer Wechsel von Algorithmen ermöglicht wird. Im Beobachtermuster werden Schnittstellen zum Definieren des Beobachterverhaltens verwendet, und abstrakte oder konkrete Klassen werden zum Abonnieren und Veröffentlichen von Benachrichtigungen verwendet. Im Adaptermuster werden Schnittstellen verwendet, um vorhandene Klassen anzupassen, oder konkrete Klassen können kompatible Schnittstellen implementieren und so eine Interaktion mit Originalcode ermöglichen.

Was ist der Unterschied zwischen Schnittstellen und abstrakten Klassen in PHP? Was ist der Unterschied zwischen Schnittstellen und abstrakten Klassen in PHP? Jun 04, 2024 am 09:17 AM

Schnittstellen und abstrakte Klassen werden verwendet, um erweiterbaren PHP-Code zu erstellen, und es gibt den folgenden Hauptunterschied zwischen ihnen: Schnittstellen erzwingen durch Implementierung, während abstrakte Klassen durch Vererbung erzwungen werden. Schnittstellen können keine konkreten Methoden enthalten, abstrakte Klassen hingegen schon. Eine Klasse kann mehrere Schnittstellen implementieren, aber nur von einer abstrakten Klasse erben. Schnittstellen können nicht instanziiert werden, abstrakte Klassen jedoch schon.

Einblick in das Hongmeng-System: tatsächliche Funktionsmessung und Nutzungserfahrung Einblick in das Hongmeng-System: tatsächliche Funktionsmessung und Nutzungserfahrung Mar 23, 2024 am 10:45 AM

Als neues Betriebssystem von Huawei hat das Hongmeng-System in der Branche für großes Aufsehen gesorgt. Als neuer Versuch von Huawei nach dem US-Verbot setzt das Hongmeng-System große Hoffnungen und Erwartungen. Kürzlich hatte ich das Glück, ein Huawei-Mobiltelefon mit dem Hongmeng-System zu bekommen. Nach einer Nutzungsphase und tatsächlichen Tests werde ich einige Funktionstests und Nutzungserfahrungen des Hongmeng-Systems teilen. Werfen wir zunächst einen Blick auf die Benutzeroberfläche und die Funktionen des Hongmeng-Systems. Das Hongmeng-System übernimmt insgesamt den Huawei-eigenen Designstil, der einfach, klar und reibungslos in der Bedienung ist. Auf dem Desktop diverse

Innerklassenimplementierung von Schnittstellen und abstrakten Klassen in Java Innerklassenimplementierung von Schnittstellen und abstrakten Klassen in Java Apr 30, 2024 pm 02:03 PM

Java ermöglicht die Definition innerer Klassen innerhalb von Schnittstellen und abstrakten Klassen und bietet so Flexibilität für die Wiederverwendung und Modularisierung von Code. Innere Klassen in Schnittstellen können spezifische Funktionen implementieren, während innere Klassen in abstrakten Klassen allgemeine Funktionen definieren können und Unterklassen konkrete Implementierungen bereitstellen.

See all articles