Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Référence des unités
Les premiers pas
Travailler avec l'application
Conteneur de dépendances
Répartiteur
Environnement CGI
Configurer l'application
Gestionnaire d'erreurs
Travailler avec un routeur
Travailler avec une base de données
Utilisation des journaux de bord
Travailler avec Fano CLI
Préface
Notes légales
Dictionnaire
Recherche

Travailler avec l'application

Interface IWebApplication

Dans Fano Framework, l'application doit implémenter l'interface IWebApplication. Actuellement, elle ne fournit aucune méthode à l'exception de la méthode run() héritée de l'interface IRunnable étant son parent.

Implémentation intégrée

Le Fano Framework fournit des implémentations intégrées de IWebApplication :

Implémentation Description
TCgiWebApplication Une application Web CGI implémentant le protocole CGI. Il s'agit essentiellement d'une application interpréteur de commande s'exécutant puis se termine après avoir terminé son travail.
TDaemonWebApplication Est une application Web s'exécutant en permanence et écoute les requêtes jusqu'à ce qu'elle soit terminée manuellement. Elle est principalement utilisée pour les applications Web FastCGI, SCGI et uwsgi.

Interface IAppServiceProvider

Le TCgiWebApplication dépend de l'instance de l'interface IAppServiceProvider tandis que TDaemonWebApplication dépend de IDaemonAppServiceProvider. Ils fournissent des services essentiels pour l'application. Le code suivant est la déclaration de cette interface :

  1. Type
  2.  IAppServiceProvider=Interface(IServiceProvider)
  3.    ['{41032A70-F31D-45A6-AE26-574888BE4D07}']
  4.   Function getContainer():IDependencyContainer;
  5.   Property container:IDependencyContainer read getContainer;
  6.  
  7.   Function getErrorHandler():IErrorHandler;
  8.   Property errorHandler:IErrorHandler read getErrorHandler;
  9.  
  10.   Function getDispatcher():IDispatcher;
  11.   Property dispatcher:IDispatcher read getDispatcher;
  12.  
  13.   Function getEnvironment():ICGIEnvironment;
  14.   Property env:ICGIEnvironment read getEnvironment;
  15.  
  16.   Function getRouter():IRouter;
  17.   Property router:IRouter read getRouter;
  18.  
  19.   Function getStdIn():IStdIn;
  20.   Property stdIn:IStdIn read getStdIn;
  21.  End;
  22.  
  23.  IDaemonAppServiceProvider = interface(IAppServiceProvider)
  24.    ['{4FF6129E-171F-429C-BE5B-7A8B941D3626}']
  25.   Function getServer() : IRunnableWithDataNotif;
  26.   Property server : IRunnableWithDataNotif read getServer;
  27.  
  28.   Function getProtocol():IProtocolProcessor;
  29.   Property protocol:IProtocolProcessor read getProtocol;
  30.  
  31.   Function getOutputBuffer():IOutputBuffer;
  32.   Property outputBuffer:IOutputBuffer read getOutputBuffer;
  33.  
  34.   Function getStdOut():IStdOut;
  35.   Property stdOut:IStdOut read getStdOut;
  36.  End;

Le Fano Framework fournit plusieurs implémentations intégrées de cette interface que vous pouvez utiliser ou étendre :

Implémentation Description
TBasicAppServiceProvider Classe abstraite implémentant l'interface IAppServiceProvider. La plupart des méthodes ont déjà une implémentation, à l'exception de sa méthode register() que vous devez implémenter pour enregistrer les dépendances spécifiques à votre application. Pour les applications Web CGI, cette classe est celle que vous devez utiliser.
TDaemonAppServiceProvider La classe abstraite hérite de la classe TBasicAppServiceProvider implémentant l'interface IDaemonAppServiceProvider. La plupart des méthodes ont déjà une implémentation, à l'exception de sa méthode register() que vous devez implémenter pour enregistrer les dépendances spécifiques à votre application. Pour un service d'application Web, cette classe est celle que vous devez utiliser.
TServerAppServiceProvider Classe fournissant un serveur de travail pour le service de l'application Web.
TFastCgiAppServiceProvider Classe fournissant des services essentiels pour l'application Web FastCGI.
TScgiAppServiceProvider Classe fournissant des services essentiels pour l'application Web SCGI.
TUwsgiAppServiceProvider Classe fournissant des services essentiels pour l'application Web uwsgi.
TMhdAppServiceProvider Classe fournissant des services essentiels pour l'application Web libmicrohttpd.

Interface IRouteBuilder

Lors de la création d'une instance d'application, vous devez également implémenter l'interface IRouteBuilder étant chargée de configurer les itinéraires d'application.

Application CGI

TCgiWebApplication est une classe intégrée implémentant le protocole CGI. Sa tâche consiste essentiellement à lire les variables d'environnement CGI que le serveur Web envoie et à appeler le gestionnaire de requêtes approprié.

Sa méthode constructeur attend deux paramètres, une instance de l'interface IAppServiceProvider et IRouteBuilder. Le premier paramètre doit fournir les services essentiels requis par l'application et également enregistrer toutes les dépendances de l'application.

Pour l'application CGI, Fano Framework fournit la classe abstraite TBasicAppServiceProvider que vous devez étendre pour enregistrer vos dépendances d'application. Vous devez implémenter sa méthode register().

Le dernier paramètre est une instance de la classe responsable de la création des routes d'application. Fano Framework fournit la classe abstraite de base TRouteBuilder que vous devez étendre. Vous devez implémenter sa méthode buildRoutes(). Veuillez noter que vous n'êtes pas obligé d'hériter de la classe TRouteBuilder. Vous pouvez utiliser n'importe quelle classe tant qu'elle implémente l'interface IRouteBuilder.

  1. appInstance:=TCgiWebApplication.create(TAppServiceProvider.create(),TAppRoutes.create());

Où TAppServiceProvider est déclaré comme suit :

  1. TAppServiceProvider=Class(TBasicAppServiceProvider)
  2.  Public
  3.   Procedure register(const container : IDependencyContainer); override;
  4. End;
  5. ...
  6.  Procedure TAppServiceProvider.register(const container : IDependencyContainer);Begin
  7.     //inscrivez ici tous les services requis pour l'application
  8.  End;
  9.  
  10. TAppRoutes=class(TRouteBuilder)
  11.  Public
  12.   Procedure buildRoutes(Const container:IDependencyContainer;Const Router:IRouter); override;
  13.  End;
  14. ...
  15.  Procedure TAppRoutes.buildRoutes(Const container:IDependencyContainer;Const Router:IRouter);Begin
  16.   //inscrivez tous les itinéraires ici
  17.  End;

Service d'application Web

L'application Web s'exécutant en permanence en arrière-plan doit configurer un fournisseur de services héritant de TDaemonAppServiceProvider, comme une application Web utilisant le protocole FastCGI, SCGI ou uwsgi, car l'application dépend de l'interface IDaemonAppServiceProvider.

  1. TAppServiceProvider=Class(TDaemonAppServiceProvider)
  2.  Public
  3.   Procedure register(Const container:IDependencyContainer); override;
  4. End;

Application FastCGI

Pour créer une application Web prenant en charge le protocole FastCGI, créez un fournisseur de services d'application utilisant TFastCgiAppServiceProvider comme indiqué dans le code suivant :

  1. appInstance:=TDaemonWebApplication.create(
  2.         TFastCgiAppServiceProvider.create(
  3.                 TServerAppServiceProvider.create(
  4.                         TAppServiceProvider.create(),
  5.                         (TInetSvrFactory.create(host, port) as ISocketSvrFactory).build()
  6.                 )
  7.         ),
  8.         TAppRoutes.create()
  9. );

Vous pouvez remplacer TInetSvrFactory par la classe TUnixSvrFactory si vous souhaitez utiliser le fichier de socket de domaine Unix au lieu du port TCP.

Vous pouvez remplacer TInetSvrFactory par TBoundSvrFactory si vous souhaitez créer une application FastCGI s'exécutant et est gérée par un serveur Web, par exemple Apache avec le module mod_fcgid.

TInetSvrFactory, TUnixSvrFactory et TBoundSvrFactory utilisent select pour surveiller si le socket est prêt pour l'opération d'entrée/sortie. Pour utiliser epoll, remplacez par TEpollInetSvrFactory, TEpollUnixSvrFactory et TEpollBoundSvrFactory. Si vous utilisez FreeBSD, pour utiliser kqueue, remplacez-le par TKqueueInetSvrFactory, TKqueueUnixSvrFactory et TKqueueBoundSvrFactory. Vous devez ajouter une définition de compilation conditionnelle $DEFINE USE_KQUEUE ou ajouter la ligne -dUSE_KQUEUE dans le fichier build.cfg.

Application SCGI

Pour créer une application Web prenant en charge le protocole SCGI (Simple Common Gateway Interface), créez un fournisseur de services d'application utilisant TScgiAppServiceProvider comme indiqué dans le code suivant :

  1. appInstance:=TDaemonWebApplication.create(
  2.     TScgiAppServiceProvider.create(
  3.         TServerAppServiceProvider.create(
  4.             TAppServiceProvider.create(),
  5.             (TInetSvrFactory.create(host, port) as ISocketSvrFactory).build()
  6.         )
  7.     ),
  8.     TAppRoutes.create()
  9. );

Application Uwsgi

Pour créer une application Web prenant en charge le protocole uwsgi, créez un fournisseur de services d'application utilisant TUwsgiAppServiceProvider comme indiqué dans le code suivant :

  1. appInstance:=TDaemonWebApplication.create(
  2.     TUwsgiAppServiceProvider.create(
  3.         TServerAppServiceProvider.create(
  4.             TAppServiceProvider.create(),
  5.             (TInetSvrFactory.create(host, port) as ISocketSvrFactory).build()
  6.         )
  7.     ),
  8.     TAppRoutes.create()
  9. );

Application HTTP

Pour créer une application Web prenant en charge le protocole http à l'aide de libmicrohttpd, créez un fournisseur de services d'application qui utilise TMhdAppServiceProvider et remplissez également la configuration du serveur Web comme indiqué dans le code suivant :

  1. var
  2.     svrConfig:TMhdSvrConfig;
  3. (* ... *)
  4.     svrConfig.host:='exemple.fano';
  5.     svrConfig.port:=8080;
  6.     svrConfig.documentRoot:=getCurrentDir() + '/public';
  7.     svrConfig.serverName:='exemple.fano';
  8.     svrConfig.serverAdmin:='admin@exemple.fano';
  9.     svrConfig.serverSoftware:='Fano Framework Web App';
  10.     svrConfig.timeout:=120; // délai d'expiration de la connexion en secondes
  11.  
  12.     appInstance:=TDaemonWebApplication.create(
  13.         TMhdAppServiceProvider.create(
  14.             TAppServiceProvider.create(),
  15.             svrConfig
  16.         ),
  17.         TAppRoutes.create()
  18.     );

Utiliser l'adresse IPv6

Si vous souhaitez créer un serveur d'application Web lié à l'adresse IPv6, remplacez TInetSvrFactory, TEpollInetSvrFactory, TKqueueInetSvrFactory par la classe TInet6SvrFactory, TEpollInet6SvrFactory, TKqueueInet6SvrFactory respectivement.

Vous devrez peut-être remplacer l'adresse du serveur dans le module proxy du serveur Web. Par exemple, pour une application SCGI utilisant le module Apache mod_proxy_scgi, vous devez modifier la configuration de l'hôte virtuel comme indiqué dans l'exemple suivant.

# Adresse IPv4
# ProxyPassMatch ^/(.*)$ "scgi://127.0.0.1:20477"

# Adresse IPv6
ProxyPassMatch ^/(.*)$ "scgi://[::1]:20477"

Veuillez noter que l'adresse IPv6 doit être entre crochets.

Pour les applications Web basées sur libmicrohttpd, vous pouvez ajouter la prise en charge de l'adresse IPv6 en définissant le champ useIPv6 de l'enregistrement TMhdSvrConfig sur true. Si vous avez besoin à la fois d'IPv4 et d'IPv6, définissez le champ dualStack de TMhdSvrConfig sur true.

  1. var svrConfig:TMhdSvrConfig;
  2. ...
  3. svrConfig.useIPv6:=true;
  4. svrConfig.dualStack:=false; // Seulement IPv6

Comment choisir l'implémentation d'IWebApplication ?

Implémentation Avantages Inconvénients
Application CGI Facile à configurer, en particulier sur un hébergement partagé où vous ne possédez pas de privilège d'administrateur de serveur. Pas très performant par rapport à l'application FastCGI ou SCGI en raison du fonctionnement du protocole CGI.
Application FastCGI Les performances sont bonnes par rapport à l'application CGI. Nécessite un privilège d'administrateur de serveur pour la configuration. Vous ne pouvez pas déployer facilement l'application sur un hébergement partagé.
Application SCGI Les performances sont bonnes par rapport à l'application CGI et peut-être légèrement meilleures que FastCGI en raison d'une spécification de protocole plus simple. Nécessite un privilège d'administrateur de serveur pour la configuration. Vous ne pouvez pas déployer facilement l'application sur un hébergement partagé.
Application uwsgi Les performances sont comparables au protocole SCGI mais nécessitent moins de bande passante réseau en raison de l'utilisation du protocole binaire. Nécessite un privilège d'administrateur de serveur pour la configuration. Vous ne pouvez pas déployer facilement l'application sur un hébergement partagé.


PARTAGER CETTE PAGE SUR
Dernière mise à jour : Vendredi, le 18 octobre 2024