BACKEND FAKE SERVER

 

Contoh Backend Palsu untuk Pengembangan Tanpa Backend
Backend palsu digunakan untuk melakukan pengembangan backendless di Angular yang memungkinkan Anda mendemonstrasikan kode Anda tanpa perlu membuat api server backend, ini sempurna untuk kode yang dihosting di StackBlitz yang tidak memiliki backend, atau ketika Anda sedang mengembangkan ujung depan sebelum backend tersedia. Saya membuat backend palsu di bawah ini sebagai bagian dari Pendaftaran Pengguna Angular 9 dan Contoh & Tutorial Login, itu dibangun dengan memperluas antarmuka Angular HttpInterceptor dan menyertakan titik akhir tiruan untuk otentikasi dan manajemen pengguna, dan menggunakan penyimpanan lokal browser untuk menyimpan data sehingga dapat berperilaku seperti api nyata termasuk persistensi data. Melewati permintaan yang tidak dibuat-buat ke API backend yang sebenarnya Terkadang ada kebutuhan untuk melewati permintaan khusus ke server alih-alih ditangkap oleh backend palsu, misalnya ketika backend asli sebagian selesai dan memiliki beberapa titik akhir yang tersedia. Dengan pencegat HTTP Angular 9 ini dilakukan dengan memanggil return next.handle(request);, Anda dapat melihat kode untuk melewati permintaan di bagian bawah contoh kode di bawah ini. Penyedia Backend Palsu 9 Sudut

import { Injectable } from '@angular/core';
import { HttpRequest, HttpResponse, HttpHandler, HttpEvent, HttpInterceptor, HTTP_INTERCEPTORS } from '@angular/common/http';
import { Observable, of, throwError } from 'rxjs';
import { delay, mergeMap, materialize, dematerialize } from 'rxjs/operators';

// array in local storage for registered users
let users = JSON.parse(localStorage.getItem('users')) || [];

@Injectable()
export class FakeBackendInterceptor implements HttpInterceptor {
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const { url, method, headers, body } = request;

        // wrap in delayed observable to simulate server api call
        return of(null)
            .pipe(mergeMap(handleRoute))
            .pipe(materialize()) // call materialize and dematerialize to ensure delay even if an error is thrown (https://github.com/Reactive-Extensions/RxJS/issues/648)
            .pipe(delay(500))
            .pipe(dematerialize());

        function handleRoute() {
            switch (true) {
                case url.endsWith('/users/authenticate') && method === 'POST':
                    return authenticate();
                case url.endsWith('/users/register') && method === 'POST':
                    return register();
                case url.endsWith('/users') && method === 'GET':
                    return getUsers();
                case url.match(/\/users\/\d+$/) && method === 'GET':
                    return getUserById();
                case url.match(/\/users\/\d+$/) && method === 'PUT':
                    return updateUser();
                case url.match(/\/users\/\d+$/) && method === 'DELETE':
                    return deleteUser();
                default:
                    // pass through any requests not handled above
                    return next.handle(request);
            }    
        }

        // route functions

        function authenticate() {
            const { username, password } = body;
            const user = users.find(x => x.username === username && x.password === password);
            if (!user) return error('Username or password is incorrect');
            return ok({
                id: user.id,
                username: user.username,
                firstName: user.firstName,
                lastName: user.lastName,
                token: 'fake-jwt-token'
            })
        }

        function register() {
            const user = body

            if (users.find(x => x.username === user.username)) {
                return error('Username "' + user.username + '" is already taken')
            }

            user.id = users.length ? Math.max(...users.map(x => x.id)) + 1 : 1;
            users.push(user);
            localStorage.setItem('users', JSON.stringify(users));
            return ok();
        }

        function getUsers() {
            if (!isLoggedIn()) return unauthorized();
            return ok(users);
        }

        function getUserById() {
            if (!isLoggedIn()) return unauthorized();

            const user = users.find(x => x.id === idFromUrl());
            return ok(user);
        }

        function updateUser() {
            if (!isLoggedIn()) return unauthorized();

            let params = body;
            let user = users.find(x => x.id === idFromUrl());

            // only update password if entered
            if (!params.password) {
                delete params.password;
            }

            // update and save user
            Object.assign(user, params);
            localStorage.setItem('users', JSON.stringify(users));

            return ok();
        }

        function deleteUser() {
            if (!isLoggedIn()) return unauthorized();

            users = users.filter(x => x.id !== idFromUrl());
            localStorage.setItem('users', JSON.stringify(users));
            return ok();
        }

        // helper functions

        function ok(body?) {
            return of(new HttpResponse({ status: 200, body }))
        }

        function error(message) {
            return throwError({ error: { message } });
        }

        function unauthorized() {
            return throwError({ status: 401, error: { message: 'Unauthorised' } });
        }

        function isLoggedIn() {
            return headers.get('Authorization') === 'Bearer fake-jwt-token';
        }

        function idFromUrl() {
            const urlParts = url.split('/');
            return parseInt(urlParts[urlParts.length - 1]);
        }
    }
}

export const fakeBackendProvider = {
    // use fake backend in place of Http service for backend-less development
    provide: HTTP_INTERCEPTORS,
    useClass: FakeBackendInterceptor,
    multi: true
};


Menghubungkan Backend Palsu ke Aplikasi Angular 9 Anda

Untuk menambahkan penyedia backend palsu ke aplikasi Angular 9 Anda, Anda perlu mengimpor fakeBackendProvider di modul aplikasi Anda seperti yang ditunjukkan di bawah ini, dan menambahkan fakeBackendProvider ke daftar penyedia di modul aplikasi Anda.


Di bawah ini adalah kode modul aplikasi lengkap untuk contoh di mana backend palsu digunakan, tutorial lengkap tersedia di sini.

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';

// used to create fake backend
import { fakeBackendProvider } from './_helpers';

import { AppRoutingModule } from './app-routing.module';
import { JwtInterceptor, ErrorInterceptor } from './_helpers';
import { AppComponent } from './app.component';
import { AlertComponent } from './_components';
import { HomeComponent } from './home';

@NgModule({
    imports: [
        BrowserModule,
        ReactiveFormsModule,
        HttpClientModule,
        AppRoutingModule
    ],
    declarations: [
        AppComponent,
        AlertComponent,
        HomeComponent
    ],
    providers: [
        { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
        { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },

        // provider used to create fake backend
        fakeBackendProvider
    ],
    bootstrap: [AppComponent]
})
export class AppModule { };

 

Komentar

Postingan populer dari blog ini

PENGENALAN BEAUTIFULSOAP

PEMANFAATAN FUNGSI FIND_ALL

DASAR PEMOGRAMAN BACKEND