Skip to content

12. [vuejs-10] projesi: [dao] eklentisi, HTTP asenkron istekleri

[vuejs-10] projesinin dizin yapısı şöyledir:

Image

[vuejs-10] projesi, uzak bir sunucuya HTTP isteği gönderen bir bileşeni göstermektedir. Kullanılan mimari şöyledir:

Image

[Vue.js] bileşeni, vergi hesaplama sunucusuyla iletişim kurmak için [dao] katmanını kullanır.

12.1. Bağımlılıkların kurulumu

[vuejs-10] uygulaması, vergi hesaplama sunucusuna asenkron istekler göndermek için [axios] kütüphanesini kullanır. Bu bağımlılığı yüklememiz gerekir:

Image

  • [4-5]'te, [axios] kütüphanesinin yüklenmesinden sonra [package.json] dosyasına eklenen satır [1-3] ;

12.2. [Dao] sınıfı

[Dao] sınıfı, [La classe Dao] paragrafında geliştirilen sınıftır. Hatırlatma amacıyla burada tekrar veriyoruz:


'use strict';

// ithalatlar
import qs from 'qs'

// sınıf [Dao]
class Dao {

  // yapıcı
  constructor(axios) {
    this.axios = axios;
    // oturum çerezi
    this.sessionCookieName = "PHPSESSID";
    this.sessionCookie = '';
  }

  // oturum başlatma
  async  initSession() {
    // istek seçenekleri HHTP [get /main.php?action=init-session&type=json]
    const options = {
      method: "GET",
      // URL parametreleri
      params: {
        action: 'init-session',
        type: 'json'
      }
    };
    // HTTP sorgusunun yürütülmesi
    return await this.getRemoteData(options);
  }

  async  authentifierUtilisateur(user, password) {
    // HHTP isteğinin seçenekleri [post /main.php?action=authentifier-utilisateur]
    const options = {
      method: "POST",
      headers: {
        'Content-type': 'application/x-www-form-urlencoded',
      },
      // POST'in gövdesi
      data: qs.stringify({
        user: user,
        password: password
      }),
      // URL'in parametreleri
      params: {
        action: 'authentifier-utilisateur'
      }
    };
    // HTTP isteğinin yürütülmesi
    return await this.getRemoteData(options);
  }

  async getAdminData() {
    // HHTP sorgusunun seçenekleri  [get /main.php?action=get-admindata]
    const options = {
      method: "GET",
      // URL parametreleri
      params: {
        action: 'get-admindata'
      }
    };
    // HTTP sorgusunun yürütülmesi
    const data = await this.getRemoteData(options);
    // sonuç
    return data;
  }

  async  getRemoteData(options) {
    // oturum çerezi için
    if (!options.headers) {
      options.headers = {};
    }
    options.headers.Cookie = this.sessionCookie;
    // HTTP isteğinin yürütülmesi
    let response;
    try {
      // asenkron istek
      response = await this.axios.request('main.php', options);
    } catch (error) {
      // [error] parametresi bir istisna örneğidir - çeşitli biçimlerde olabilir
      if (error.response) {
        // sunucunun yanıtı [error.response]'tedir
        response = error.response;
      } else {
        // hata yeniden gönderiliyor
        throw error;
      }
    }
    // response, sunucudan gelen HTTP yanıtının tamamıdır (HTTP başlıkları + yanıtın kendisi)
    // varsa oturum çerezi alınır
    const setCookie = response.headers['set-cookie'];
    if (setCookie) {
      // setCookie bir dizidir
      // bu dizide oturum çerezi aranır
      let trouvé = false;
      let i = 0;
      while (!trouvé && i < setCookie.length) {
        // oturum çerezi aranır
        const results = RegExp('^(' + this.sessionCookieName + '.+?);').exec(setCookie[i]);
        if (results) {
          // oturum çerezi kaydedilir
          // eslint-disable-next-line require-atomic-updates
          this.sessionCookie = results[1];
          // bulundu
          trouvé = true;
        } else {
          // sonraki öğe
          i++;
        }
      }
    }
    // sunucu yanıtı şurada: [response.data]
    return response.data;
  }
}

// sınıfın dışa aktarımı
export default Dao;

[vuejs-10] projesi, yalnızca 18-30. satırlardaki [initSession] asenkron yöntemini kullanır. [Dao] sınıfının, 10. satırda [axios] parametresiyle örneklendiğini hatırlatırız; bu parametre, çağıran kod tarafından başlatılır. Bu çağıran kod, burada [./main.js] komut dosyası olacaktır.

12.3. [pluginDao] eklentisi

[pluginDao] eklentisi şöyledir:


export default {
  install(Vue, dao) {
    // Vue sınıfına [$dao] özelliği ekleniyor
    Object.defineProperty(Vue.prototype, '$dao', {
      // Vue.$dao referanslandığında, 2. parametre [dao] olarak döndürülür
      get: () => dao,
    })
  }
}

[event-bus] eklentisi için verilen açıklamayı hatırlarsak, [pluginDao] eklentisinin, [Vue] sınıfında/fonksiyonunda [$dao] adlı yeni bir özellik oluşturduğunu görürüz. Bu özelliğin değeri (bunun henüz kanıtlanması gerekiyor), [./Dao] komut dosyası tarafından dışa aktarılan nesne, yani önceki [Dao] sınıfı olacaktır.

12.4. Ana komut dosyası [main.js]

[main.js] ana komut dosyasının kodu şöyledir:


// ithalatlar
import Vue from 'vue'
import App from './App.vue'
import axios from 'axios';

// eklentiler
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue);

// bootstrap
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'

// katman [dao]
import Dao from './Dao';
// axios yapılandırması
axios.defaults.timeout = 2000;
axios.defaults.baseURL = 'http://localhost/php7/scripts-web/impots/version-14';
axios.defaults.withCredentials = true;
// katman örneği [dao]
const dao = new Dao(axios);

// [dao] eklentisi
import pluginDao from './plugins/dao'
Vue.use(pluginDao, dao)

// yapılandırma
Vue.config.productionTip = false

// [App] projesinin örneği
new Vue({
  render: h => h(App),
}).$mount('#uygulama')

[main.js] komut dosyası:

  • 14-21. satırlarda [dao] katmanını başlatır;
  • 24-25. satırlarda [pluginDao] eklentisini entegre eder;
  • 15. satır: [Dao] sınıfı içe aktarılır;
  • 17-18. satırlar: HTTP sorgularını gerçekleştiren [axios] nesnesi yapılandırılır. Bu nesne 4. satırda içe aktarılır;
    • satır 17: 2 saniyelik bir [timeout] tanımlanır;
    • satır 18: vergi hesaplama sunucusuna ait URL;
    • 19. satır: sunucuyla çerez alışverişi yapabilmek için;
  • 24-25. satırlar: [pluginDao] eklentisinin kullanımı
    • 24. satır: eklentinin içe aktarılması;
    • 25. satır: eklentinin entegrasyonu. [Vue.use] yönteminin ikinci parametresinin, 21. satırda tanımlanan [dao] katmanının referansı olduğu görülmektedir. Bu nedenle, [Vue.$dao] özelliği, [Vue] sınıfının/fonksiyonunun tüm örneklerinde, yani tüm [Vue.js] bileşenlerinde [dao] katmanını işaret edecektir;

12.5. [App.vue] ana görünümü

[App] ana görünümünün kodu şöyledir:


<template>
  <div class="container">
    <b-card>
      <!-- mesaj -->
      <b-alert show variant="success" align="center">
        <h4>[vuejs-10] : plugin [dao], requêtes HTTP asynchrones</h4>
      </b-alert>
      <!-- vergi hesaplama sunucusuna asenkron istek gönderen bileşen-->
      <Component1 @error="doSomethingWithError" @endWaiting="endWaiting" @beginWaiting="beginWaiting" />
      <!-- olası bir hatanın görüntülenmesi -->
      <b-alert show
               variant="danger"
               v-if="showError">Evénement [error] intercepté par [App]. Valeur reçue = {{error}}</b-alert>
      <!-- dönme simgesi içeren bekleme mesajı -->
      <b-alert show v-if="showWaiting" variant="light">
        <strong>Requête au serveur de calcul d'impôt en cours...</strong>
        <b-spinner variant="primary" label="Spinning"></b-spinner>
      </b-alert>
    </b-card>
  </div>
</template>

<script>
  import Component1 from "./components/Component1";
  export default {
    name: "app",
    // bileşenin durumu
    data() {
      return {
        // bekleme dönen simgesini kontrol eder
        showWaiting: false,
        // hata mesajının görüntülenmesini kontrol eder
        showError: false,
        // yakalanan hata
        error: {}
      };
    },
    // kullanılan bileşenler
    components: {
      Component1
    },
    // olay yönetimi yöntemleri
    methods: {
      // bekleme başlangıcı
      beginWaiting() {
        // bekleme durumu görüntülenir
        this.showWaiting = true;
        // hata mesajı gizlenir
        this.showError = false;
      },
      // bekleme sonu
      endWaiting() {
        // bekleme gizlenir
        this.showWaiting = false;
      },
      // hata yönetimi
      doSomethingWithError(error) {
        // hata oluştuğu kaydedilir
        this.error = error;
        // hata mesajı görüntüleniyor
        this.showError = true;
      }
    }
  };
</script>

Açıklamalar

  • 9. satır: [Component1], HTTP asenkron isteğini gerçekleştiren bileşendir. Üç olay gönderebilir:
    • [beginWaiting]: İstek yapılmak üzere. Kullanıcıya bir bekleme mesajı gösterilmelidir;
    • [endWaiting]: İstek tamamlandı. Bekleme sonlandırılmalıdır;
    • [error]: İstek başarısız oldu. Bir hata mesajı görüntülenmelidir;
  • 10-13. satırlar: Olası hata mesajını görüntüleyen uyarı. Bu uyarı, 33. satırdaki [showError] boole değeri tarafından kontrol edilir. 35. satırdaki hatayı görüntüler;
  • satır 14-18: Bekleme mesajını bir dönen simgeyle birlikte görüntüleyen uyarı. Bu uyarı, 47. satırdaki [showWaiting] boole değişkeni tarafından kontrol edilir;
  • satır 45-50: [beginWaiting], [beginWaiting] olayının alınmasıyla yürütülen yöntemdir. Bu yöntem, bekleme mesajını görüntüler (47. satır) ve önceki bir işlem sonucunda hata mesajının görünür durumda olması durumunda bu mesajı gizler (49. satır);
  • satır 52-55: [endWaiting], [endWaiting] olayı alındığında yürütülen yöntemdir. Bekleme mesajını gizler (satır 54);
  • satır 57-62: [doSomethingWithError], [error] olayı alındığında yürütülen yöntemdir. Alınan hatayı kaydeder (satır 59) ve hata mesajını görüntüler (satır 61);

12.6. [Component1] bileşeni

[Component1] bileşeninin kodu şöyledir:


<template>
  <b-row>
    <b-col>
      <b-alert show
               variant="warning"
               v-if="showMsg">Valeur reçue du serveur = {{data}}</b-alert>
    </b-col>
  </b-row>
</template>

<script>
  export default {
    name: "component1",
    // bileşen durumu
    data() {
      return {
        showMsg: false
      };
    },
    // olay yönetimi yöntemleri
    methods: {
      // sunucudan alınan verinin işlenmesi
      doSomethingWithData(data) {
        // alınan veriler kaydedilir
        this.data = data;
        // veriler görüntülenir
        this.showMsg = true;
      }
    },
    // bileşen az önce oluşturuldu
    created() {
      // sunucu ile oturum başlatılıyor - asenkron istek
      // [dao] katmanındaki yöntemler tarafından döndürülen söz kullanılıyor
      // işlemin başlangıcı bildiriliyor
      this.$emit("beginWaiting");
      // asenkron işlem başlatılıyor
      this.$dao
        // Vergi hesaplama sunucusuyla bir jSON oturumu başlatılır
        .initSession()
        // işlem başarılı olduğunda alınan veriyi işleyen yöntem
        .then(data => {
          // Alınan veriyi işler
          this.doSomethingWithData(data);
        })
        // hata durumunda hatayı işleyen yöntem
        .catch(error => {
          // hatayı üst bileşene bildirir
          this.$emit("error", error.message);
        }).finally(() => {
          // bekleme sona erdi
          this.$emit("endWaiting");
        })
    }
  };
</script>

Açıklamalar

  • 4-6. satırlar: Bileşen, yalnızca HTTP isteğinin başarılı olması durumunda, vergi hesaplama sunucusu tarafından döndürülen değeri görüntüleyen tek bir uyarıdan oluşur. Bu uyarı, 17. satırdaki [showMsg] boole değeri tarafından kontrol edilir;
  • satır 31-53: HTTP isteği, bileşen oluşturulur oluşturulmaz yapılır. Dolayısıyla, kod 31. satırdaki [created] yöntemine yerleştirilir;
  • 35. satır: üst bileşene asenkron isteğin başlayacağı bildirilir;
  • satır 37-39: [this.$dao.initSession] yöntemi yürütülür. Bu yöntem, vergi hesaplama sunucusuyla bir jSON oturumu başlatır. Bu yöntemin anlık sonucu bir [Promise]'tir;
  • satır 41-44: Bu kod, sunucu hatasız bir şekilde sonucunu döndürdüğünde yürütülür. Sunucunun sonucu [data]'te bulunur. 43. satırda, [doSomethingWithData] yönteminden bu sonucu işlemesi istenir;
  • satır 46-49: Bu kod, isteğin yürütülmesi sırasında bir hata oluşması durumunda çalışır. Satır 48’de, üst bileşene bir hata oluştuğu bildirilir ve [error.message] hata mesajı iletilir;
  • 49-52. satırlar: Bu kod her durumda yürütülür. Üst bileşene, HTTP isteğinin tamamlandığı bildirilir;
  • 23-28. satırlar: [doSomethingWithData] yöntemi, sunucu tarafından gönderilen [data] verisini işlemekle görevli yöntemdir. 25. satırda bu veriler kaydedilir ve 27. satırda görüntülenir;

12.7. Projenin çalıştırılması

Image

Proje başlatıldığında, vergi hesaplama sunucusu çalışmıyorsa şu sonuç elde edilir:

Image

[Laragon] sunucusunu başlatalım (bkz. https://tahe.developpez.com/tutoriels-cours/php7) ve yukarıdaki sayfayı yeniden yükleyelim. Sonuç şu şekilde olur:

Image

Not: Burada, https://tahe.developpez.com/tutoriels-cours/php7 adresinde tanımlanan vergi hesaplama sunucusunun 14. sürümünü kullanıyoruz.