Beispielcode einer Vue-Anwendung basierend auf der Axios-Anforderungskapselung

Beispielcode einer Vue-Anwendung basierend auf der Axios-Anforderungskapselung

Was ist Axios?

Axios ist eine auf Versprechen basierende HTTP-Bibliothek, die in Browsern und node.js verwendet werden kann.

Merkmal:

  • Erstellen von XMLHttpRequests vom Browser aus
  • HTTP-Anfragen von node.js aus stellen
  • Unterstützung für Promise API
  • Abfangen von Anfragen und Antworten
  • Konvertieren von Anforderungs- und Antwortdaten
  • Anfrage abbrechen
  • JSON-Daten automatisch konvertieren
  • Clientseitiger Support für XSRF-Schutz

Versprechen

Axios benötigt eine native ES6 Promise-Implementierung, um unterstützt zu werden. Wenn Ihre Umgebung ES6 Promise nicht unterstützt, können Sie ein Polyfill verwenden.

Axios-Anforderungstyp?

Installieren Sie einen Satz von Knotenumgebungen:

Es gibt drei Möglichkeiten zum Zitieren:
npm install axios - Installieren Sie zuerst axios im Knoten und führen Sie dann axios im API-Paket ein
bower install axios --installieren Sie Bower in npm und importieren Sie das Axios-Paket in Bower

Laube:
Bower kann Komponenten verwalten, die HTML, CSS, JavaScript, Schriftarten und sogar Bilddateien enthalten. Bower verkettet oder minimiert Ihren Code nicht oder führt sonst etwas aus – es installiert nur die richtigen Versionen der Pakete und ihrer Abhängigkeiten, die Sie benötigen.
JS-Dateien direkt in Vue einführen
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

Axios kapselt die standardmäßige benutzerdefinierte Konfiguration

const Instanz = axios.create({
{
   // „url“ ist die für die Anfrage zu verwendende Server-URL
  URL: '/Benutzer',

  // `method` ist die Methode, die beim Erstellen der Anforderungsmethode verwendet wird: 'get', // Standard

  // `baseURL` wird automatisch vor `url` gestellt, es sei denn, `url` ist eine absolute URL.
  // Es ist praktisch, relative URLs an die Methoden der Axios-Instanz zu übergeben, indem man eine `baseURL` setzt
  Basis-URL: „https://some-domain.com/api/“,

  // `transformRequest` ermöglicht die Änderung von Anforderungsdaten vor dem Senden an den Server // Kann nur mit den Anforderungsmethoden 'PUT', 'POST' und 'PATCH' verwendet werden // Die Funktionen im folgenden Array müssen einen String, ArrayBuffer oder Stream zurückgeben
  transformRequest: [Funktion (Daten, Header) {
    //Führen Sie eine beliebige Konvertierung der Daten durch. Return Data;
  }],

  // `transformResponse` ermöglicht die Änderung der Antwortdaten vor der Übergabe an then/catch transformResponse: [function (data) {
    //Führen Sie eine beliebige Konvertierung der Daten durch. Return Data;
  }],

  // `headers` ist der benutzerdefinierte Anforderungsheader, der gesendet wird: {'X-Requested-With': 'XMLHttpRequest'},

  // `params` sind die URL-Parameter, die mit der Anfrage gesendet werden // muss ein einfaches Objekt oder ein URLSearchParams-Objekt sein params: {
    Nr.: 12345
  },

   // „paramsSerializer“ ist eine Funktion, die für die Serialisierung von „Params“ verantwortlich ist // (z. B. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
  paramsSerializer: Funktion(Params) {
    gibt Qs.stringify(Params, {ArrayFormat: 'Klammern'}) zurück
  },

  // `data` sind die Daten, die als Anfragetext gesendet werden sollen // Gilt nur für die Anfragemethoden 'PUT', 'POST' und 'PATCH'
  // Wenn „transformRequest“ nicht festgelegt ist, muss es einer der folgenden Typen sein:
  // - Zeichenfolge, einfaches Objekt, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - Browserspezifisch: FormData, File, Blob
  // - Knotenspezifisch: Stream
  Daten: {
    Vorname: 'Fred'
  },

  // `timeout` gibt die Anzahl der Millisekunden an, nach denen die Anforderung abläuft (0 bedeutet kein Timeout)
  // Wenn die Anfrage länger als `timeout` dauert, wird die Anfrage unterbrochen timeout: 1000,

   // `withCredentials` gibt an, ob Anmeldeinformationen für domänenübergreifende Anforderungen erforderlich sind withCredentials: false, // Standard

  // „Adapter“ ermöglicht eine benutzerdefinierte Anforderungsverarbeitung, um das Testen zu vereinfachen. // Gibt ein Versprechen mit einer gültigen Antwort zurück (siehe [Antwortdokumente](#response-api)).
  Adapter: Funktion (Konfiguration) {
    /* … */
  },

 // `auth` gibt an, dass die HTTP-Basisauthentifizierung verwendet werden soll, und stellt Anmeldeinformationen bereit // Dadurch wird ein `Authorization`-Header festgelegt, der alle vorhandenen benutzerdefinierten `Authorization`-Header überschreibt, die mit `headers` auth: { festgelegt wurden.
    Benutzername: 'janedoe',
    Passwort: „s00pers3cret“
  },

   // `responseType` gibt den Datentyp der Serverantwort an, der „Arraybuffer“, „Blob“, „Document“, „JSON“, „Text“ oder „Stream“ sein kann.
  Antworttyp: „json“, // Standard

  // `responseEncoding` gibt die Kodierung an, die zum Dekodieren von Antworten verwendet werden soll
  // Hinweis: Wird für `responseType` von 'stream' oder clientseitigen Anfragen ignoriert
  Antwortkodierung: „utf8“, // Standard

   // `xsrfCookieName` ist der Name des Cookies, der als Wert des XSRF-Tokens verwendet wird xsrfCookieName: 'XSRF-TOKEN', // Standard

  // `xsrfHeaderName` ist der Name des HTTP-Headers, der den XSRF-Token-Wert trägt
  xsrfHeaderName: 'X-XSRF-TOKEN', // Standard

   // `onUploadProgress` ermöglicht die Verarbeitung von Fortschrittsereignissen für Uploads onUploadProgress: function (progressEvent) {
    // Machen Sie mit dem nativen Fortschrittsereignis, was Sie wollen
  },

  // `onDownloadProgress` ermöglicht die Verarbeitung von Fortschrittsereignissen für den Download onDownloadProgress: function (progressEvent) {
    // Behandlung nativer Fortschrittsereignisse},

   // `maxContentLength` definiert die maximale Größe des Antwortinhalts maxContentLength: 2000,

  // „validateStatus“ definiert, ob das Versprechen für einen bestimmten HTTP-Antwortstatuscode eingelöst oder abgelehnt werden soll. Wenn „validateStatus“ „true“ zurückgibt (oder auf „null“ oder „undefined“ gesetzt ist), wird das Versprechen eingelöst, andernfalls wird das Versprechen abgelehnt.
  validateStatus: Funktion (Status) {
    Rückgabestatus >= 200 und Status < 300; // Standard
  },

  // `maxRedirects` definiert die maximale Anzahl von Weiterleitungen, denen in node.js gefolgt wird // Wenn der Wert auf 0 gesetzt ist, werden keine Weiterleitungen verfolgt maxRedirects: 5, // Standard

  // „socketPath“ definiert einen UNIX-Socket, der in node.js verwendet werden soll.
  // zB „/var/run/docker.sock“, um Anfragen an den Docker-Daemon zu senden.
  // Es kann nur entweder „socketPath“ oder „proxy“ angegeben werden.
  // Wenn beide angegeben sind, wird „socketPath“ verwendet.
  socketPath: null, // Standard

  // „httpAgent“ und „httpsAgent“ werden in node.js verwendet, um benutzerdefinierte Agenten zu definieren, die bei der Ausführung von http bzw. https verwendet werden sollen. Ermöglicht Konfigurationsoptionen wie diese:
  // `keepAlive` ist standardmäßig nicht aktiviert httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: neuer https.Agent({ keepAlive: true }),

  // „Proxy“ definiert den Hostnamen und den Port des Proxyservers. // „auth“ gibt an, dass die HTTP-Basisauthentifizierung verwendet werden soll, um eine Verbindung mit dem Proxy herzustellen und Anmeldeinformationen bereitzustellen. // Dadurch wird ein „Proxy-Authorization“-Header festgelegt, der alle vorhandenen benutzerdefinierten „Proxy-Authorization“-Header überschreibt, die mit „header“ festgelegt wurden.
  Proxy: {
    Host: '127.0.0.1',
    Port: 9000,
    Autorisierung:
      Benutzername: 'mikeymike',
      Passwort: „rapunz3l“
    }
  },

  // `cancelToken` gibt das Abbruchtoken an, das zum Abbrechen der Anfrage verwendet wird
  // (Weitere Informationen finden Sie im Abschnitt „Stornierung“ weiter unten.)
  cancelToken: neues CancelToken(Funktion (abbrechen) {
  })
}
}).dann(Funktion(Antwort){
// `data` Die vom Server bereitgestellten Antwortdaten: {},

  // `status` Der HTTP-Statuscode aus der Serverantwort Status: 200,

  // `statusText` HTTP-Statusinformationen aus der Serverantwort statusText: 'OK',

  // `headers` Server-Antwort-Header: {},

   // `config` sind die für die Anforderung bereitgestellten Konfigurationsinformationen config: {},
 // 'Anfrage'
  // „Anfrage“ ist die Anfrage, die diese Antwort generiert hat
  // Es ist die letzte ClientRequest-Instanz in node.js (in Weiterleitungen)
  // und eine XMLHttpRequest-Instanz des Browsers
  Anfrage: {}
});

Priorität beim Laden der Konfiguration

Reihenfolge von hoch nach niedrig:

Schritt 1: Standardwerte konfigurieren

In der Anforderung festgelegte Konfigurationselemente

Instanz.get('/longRequest', {
 Zeitüberschreitung: 5000
});

Teil 2: Globale Axios-Standards

In der API-Datei festgelegte Konfigurationselemente

Instanz.Standardwerte.Timeout = 2500;

Schritt 3: Standardeinstellungen der Instanz anpassen

Beim Erstellen einer Axios-Instanz festgelegte Konfigurationselemente

var Instanz = axios.create();

Abfangjäger

// Anfrage-Interceptor hinzufügen axios.interceptors.request.use(function (config) {
    // Tun Sie etwas, bevor Sie die Anfrage senden. Return-Konfiguration;
  }, Funktion (Fehler) {
    // Etwas mit dem Anforderungsfehler tun return Promise.reject(error);
  });

// Antwort-Interceptor hinzufügen axios.interceptors.response.use(function (response) {
    // Etwas mit den Antwortdaten machen return response;
  }, Funktion (Fehler) {
    Schalter (Fehler.Antwort.Status) {
      Fall 400:
        err.message = 'Fehleranforderung';
        brechen;
      Fall 401:
        err.message = „Nicht autorisiert, bitte melden Sie sich erneut an“;
        brechen;
      Fall 403:
        err.message = 'Zugriff verweigert';
        brechen;
      Fall 404:
        err.message = „Anforderungsfehler, die Ressource wurde nicht gefunden“;
        brechen;
      Fall 405:
        err.message = „Anforderungsmethode nicht zulässig“;
        brechen;
      Fall 408:
        err.message = „Zeitüberschreitung der Anforderung“;
        brechen;
       Fall 415:
        err.message = „Der Server kann das an die Anfrage angehängte Medienformat nicht verarbeiten.“;
        brechen;
      Fall 500:
        err.message = 'Serverfehler';
        brechen;
      Fall 501:
        err.message = 'Netzwerk nicht implementiert';
        brechen;
      Fall 502:
        err.message = 'Netzwerkfehler';
        brechen;
      Fall 503:
        err.message = „Dienst nicht verfügbar“;
        brechen;
      Fall 504:
        err.message = „Netzwerk-Timeout“;
        brechen;
      Fall 505:
        err.message = „Die HTTP-Version unterstützt diese Anfrage nicht“;
        brechen;
      Standard:
        err.message = `Verbindungsfehler ${err.response.status}`;
    }
  } anders {
    err.message = „Verbindung zum Server konnte nicht hergestellt werden“;
  }
  gibt Promise.resolve(err.response) zurück;
  });

importiere Vue von „vue“;
importiere Axios von „Axios“;

Anfrage erhalten

axios.get({
	Methode: 'get',
	URL: „xxxx“,
	reponseType:'', //entsprechender Typ parems:{//Eingabeparameter }
}).dann(Funktion(Antwort){
	....
})

Anfrage posten

axios({
  Methode: 'post',
  URL: '/Benutzer/12345',
  Daten: {
    Vorname: 'Fred',
    Nachname: 'Flintstone'
  }
}).dann(Funktion(res){

});

Löschanfrage

axios({
  Methode: 'löschen',
  URL: '/Benutzer/12345',
 //Parameter 1: Am Ende der Anfrage einhängen parmes: {
 }
 //Parameter 2: In die Daten des Anforderungstexts einbinden{
}
}).dann(Funktion(res){

});

Put-Anfrage: Aktualisieren Sie die gesamte Objektressource

axios({
  Methode: 'put',
  URL: '/Benutzer/12345',
 Daten{
}
}).dann(Funktion(res){

});

Patch-Anfrage: Aktualisiert lokale Ressourcen eines Objekts

axios({
  Methode: 'Patch',
  URL: '/Benutzer/12345',
 Daten{
}
}).dann(Funktion(res){

});

Geben Sie nach der Kapselung eine andere Schreibweise an:
axios.get(url[, konfiguration])
axios.delete(url[, konfiguration])
axios.post(URL[, Daten[, Konfiguration]])
axios.put(URL[, Daten[, Konfiguration]])
axios.patch(URL[, Daten[, Konfiguration]])

Gleichzeitige Anfragen

axios.all(iterierbar)
axios.spread(Rückruf)
Funktion getUserAccount() {
returniere axios.get('/Benutzer/12345');
}
Funktion getUserPermissions() {
  returniere axios.get('/Benutzer/12345/Berechtigungen');
}
//Anforderungsarray axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) { // Antworttext der entsprechenden Anfrage // beide Anfragen sind jetzt abgeschlossen }));

Was ist der Unterschied zwischen Axios und Ajax?

Achsen:

HTTP-Anfragen von node.js aus stellen

Unterstützung für Promise API

Clientseitiger Support für CSRF-Schutz

Bietet einige Schnittstellen für gleichzeitige Anfragen (wichtig, praktisch für viele Vorgänge)

Ajax:

3. Das gesamte JQuery-Projekt ist zu groß. Es ist unvernünftig, das gesamte JQuery einzuführen, wenn nur Ajax verwendet wird (die Einführung einer personalisierten Verpackungslösung ermöglicht keine CDN-Dienste).

Wie kann ich die Kapselung von Axios anpassen?

1. Erstellen Sie die Schnittstellenanforderungskapselung, Antwort, Abfangen, Authentifizierung und andere grundlegende Konfigurationsdateien index.js

Importieren Sie statische Ressourcen, importieren Sie Axios von „Axios“.
 importiere qs von „qs“;
importiere apiMap aus „./apiMap“;

Setzen Sie den globalen Standardparameter axios.defaults.withCredentials = false;
axios.defaults.headers.post['Inhaltstyp'] = 'application/json; Zeichensatz=UTF-8';

Legen Sie die Standardanforderungsparameter fest const instance = axios.create({
    Basis-URL: process.env.API_ROOT,
    Zeitüberschreitung: 15 * 1000,
    Autorisierung:
    	...
    },
    Überschriften: {
      „Inhaltstyp“: „application/json;charset=utf-8“,
      'X-Angefordert-Mit': 'XMLHttpRequest',
    },
  },
);
Einrichten der Anforderungsabfangfunktion:
Instanz.Interceptors.Request.Use(Funktion (Konfiguration) {
...
})
Entsprechende Interception einrichten:
// Antwort-Interceptor ist Ausnahmebehandlungsinstance.interceptors.response.use(response =>
   Antwort
, (err) => {
  wenn (Fehler && Fehler.Antwort) {
    Schalter (Fehler.Antwort.Status) {
      Fall 400:
        err.message = 'Fehleranforderung';
        brechen;
      Fall 401:
        err.message = „Nicht autorisiert, bitte melden Sie sich erneut an“;
        brechen;
      Fall 403:
        err.message = 'Zugriff verweigert';
        brechen;
      Fall 404:
        err.message = „Anforderungsfehler, die Ressource wurde nicht gefunden“;
        brechen;
      Fall 405:
        err.message = „Anforderungsmethode nicht zulässig“;
        brechen;
      Fall 408:
        err.message = „Zeitüberschreitung der Anforderung“;
        brechen;
       Fall 415:
        err.message = „Der Server kann das an die Anfrage angehängte Medienformat nicht verarbeiten.“;
        brechen;
      Fall 500:
        err.message = 'Serverfehler';
        brechen;
      Fall 501:
        err.message = 'Netzwerk nicht implementiert';
        brechen;
      Fall 502:
        err.message = 'Netzwerkfehler';
        brechen;
      Fall 503:
        err.message = „Dienst nicht verfügbar“;
        brechen;
      Fall 504:
        err.message = „Netzwerk-Timeout“;
        brechen;
      Fall 505:
        err.message = „Die HTTP-Version unterstützt diese Anfrage nicht“;
        brechen;
      Standard:
        err.message = `Verbindungsfehler ${err.response.status}`;
    }
  } anders {
    err.message = „Verbindung zum Server konnte nicht hergestellt werden“;
  }
  gibt Promise.resolve(err.response) zurück;
});
Anforderung der Kapselungsschnittstelle:
lass api={
	/**
	
	* Methodenkapselung erhalten	
	* @param URL
	
	* @param Parameter
	
	* @returns {Versprechen}
	
	*/
	
	erhalte (URL, Parameter = {}) {
	  returniere neues Promise((lösen, ablehnen) => {
		  Instanz.get(apiMap[url],params).then(res => {
	      auflösen(res.data)
	    }).catch(err => {
	      ablehnen (Fehler)
	    })
	  })
	},
	
	/**
	
	* Post
	
	* @param URL
	
	* @param Parameter
	
	* @returns {Versprechen}
	
	*/
	
	posten (URL, Parameter = {}) {
	  returniere neues Promise((lösen, ablehnen) => {
	    Instanz.post(APIMap[URL], Parameter)
	      .then(res => {
	        auflösen(res.data)
	      }, err => {
	        ablehnen (Fehler)
	      })
	  })
	},
	
	/**
	
	* Methodenkapselung löschen	
	* @param URL
	
	* @param Parameter
	
	* @returns {Versprechen}
	
	*/
	
	löschen (URL, Parameter = {}) {
	  returniere neues Promise((lösen, ablehnen) => {
	    Instanz.Löschen(APIMap[URL], Params).dann(Res => {
	      auflösen(res.data)
	    }).catch(err => {
	      ablehnen (Fehler)
	    })
	  })
	},
	
	/**
	
	* Kapselung der Put-Methode	
	* @param URL
	
	* @param Parameter
	
	* @returns {Versprechen}
	
	*/
	
	setze (URL, Parameter = {}) {
	  returniere neues Promise((lösen, ablehnen) => {
	    Instanz.setze(apiMap[url], params).dann(res => {
	      auflösen(res.data)
	    }).catch(err => {
	      ablehnen (Fehler)
	    })
	  })
	},
	
	/**
	
	* Patch-Methodenkapselung	
	* @param URL
	
	* @param Parameter
	
	* @returns {Versprechen}
	
	*/
	
	Patch (URL, Parameter = {}) {
	  returniere neues Promise((lösen, ablehnen) => {
	    Instanz.Patch(APIMap[URL], Parameter).dann(Res => {
	      auflösen(res.data)
	    }).catch(err => {
	      ablehnen (Fehler)
	    })
	  })
	}
}

Standard-API exportieren;

2. Erstellen Sie eine Schnittstellendatei in Form von Schlüsselwerten, um die Verwaltung von Schnittstellenanforderungen zu erleichtern apiMap.js

Standard exportieren {
  //Themenlistenschlüssel: ‚Pfad‘
};

3. Fügen Sie die Indexdatei in die Vue-Eintragdatei ein

Vue-Ressourcen importierenVue ​​aus „vue“ importieren
Importieren Sie das ViewUI-Plug-In „Importieren Sie ViewUI aus ‚View-Design‘“.
Importieren Sie die ViewUICSS-Datei „importieren Sie ‚view-design/dist/styles/iview.css‘“.
Datei importieren|Standardmäßig ist kein Dateisuffix erforderlich. Import-API von ‚/index‘.
Globale Bindung | $ legt den Bereich für Instanzeigenschaften fest Vue.prototype.$api = Api;

Globale Parameterkonfiguration:

Erstellen Sie eine Konfigurationsdatei index.js:
importiere Vue von „vue“;
importiere Vuex von „vuex“;
Importiere Status aus „./state“;
Vue.use(Vuex);
const store = neuer Vuex.Store(Status);
Standardspeicher exportieren;
Erstellen Sie eine detaillierte Datei mit globalen Parametern, state.js
Standard exportieren {
	Status: { //Hier globale Parameter einfügen Test: 0
	},
	Mutationen: { //Wert festlegen test(Zustand, Wert)=>Zustand.test=Wert;
	},
	Getter: {//Rückgabewert Test: Status => Status.test;
	}
};
Aufrufmethode:
var Daten = this.$store.getter.test;
var Daten = this.$store.commit('test', Daten);

Vue.use(Vuex);

Stellen Sie fest, ob Vue das Vuex-Plug-In registriert hat.

Integrieren Sie die Funktion vuexInit in den Lebenszyklus beforeCreate von Vue.

Wenn Vue instanziiert wird, wird die Store-Eigenschaft zu jeder Vue-Instanz hinzugefügt, und die Vuex-Instanz wird an die Store-Eigenschaft gebunden, und die Vuex-Instanz wird an

Zur Store-Eigenschaft und binden Sie die Vuex-Instanz an die Store-Eigenschaft.

Zusammenfassen

Dies ist das Ende dieses Artikels über die Vue-Anwendung basierend auf der Axios-Anforderungskapselung. Weitere verwandte Inhalte zur Axios-Anforderungskapselung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • So kapseln Sie Axios-Anfragen mit Vue
  • So kapseln Sie Axios in ein Vue-Projekt (einheitliche Verwaltung von HTTP-Anfragen)
  • Vue3+TypeScript kapselt Axios und implementiert Anforderungsaufrufe
  • Vue+axios kapselt Anfragen, um Front- und Backend zu trennen
  • Schritte für Vue zum Kapseln von Axios-Anfragen und -Interceptors
  • So verwenden Sie Axios zum Kapseln von HTTP-Anfragen in Vue-Projekten
  • Vue Axios wiederholtes Klicken bricht die letzte Anforderungskapselungsmethode ab
  • Kapselungsanforderung von Axios im Vue-Projekt

<<:  Seriennummer des Aktivierungsschlüssels für Windows Server 2016 Standard Key

>>:  Zusammenfassung gängiger MySQL-Befehle

Artikel empfehlen

So installieren und implementieren Sie Zabbix 5.0 für Nginx

Inhaltsverzeichnis Experimentelle Umgebung Instal...

Beispielcode zur Eingabe des Kennzeichens und der Provinzkürzel in html

Das Prinzip besteht darin, zuerst ein Div mit ein...

JavaScript implementiert eine Eingabefeldkomponente

In diesem Artikelbeispiel wird der spezifische Co...

Tutorial zur Installation und Deinstallation von Python3 unter Centos7

1. Installieren Sie Python 3 1. Installieren Sie ...

Auf den Alibaba Cloud Server Tomcat kann nicht zugegriffen werden

Inhaltsverzeichnis 1. Einleitung 2. Lösung 2.1 Ko...

Vue implementiert die Lupenfunktion der Produktdetailseite

In diesem Artikel wird der spezifische Code von V...

MySQLs konzeptionelles Verständnis verschiedener Sperren

Optimistisches Sperren Optimistisches Sperren wir...

Einführung in die Linux-Dateikomprimierung und -Verpackung

1. Einführung in Komprimierung und Verpackung All...

So führen Sie eine Spring Boot-Anwendung in Docker aus

In den letzten Tagen habe ich gelernt, wie man Sp...

Zusammenfassung gängiger MySQL-DDL-Operationen

Bibliotheksverwaltung Erstellen einer Bibliothek ...

Ausführliche Erläuterung der Auswirkungen von NULL auf Indizes in MySQL

Vorwort Ich habe viele Blogs gelesen und von viel...

Einführung in semantische XHTML-Tags

Der erste Punkt ist, dass Menschen die Semantik vo...