
ในบทความก่อนหน้านี้ การใช้พร็อกซี Api ใน Angular เราจัดการกับปัญหาของอินเทอร์เฟซการดีบักร่วมภายในและพร็อกซีที่ใช้
อินเทอร์เฟซของเราเขียนและประมวลผลแยกกัน ในโครงการพัฒนาจริง มีอินเทอร์เฟซจำนวนมาก ซึ่งบางส่วนต้องใช้ข้อมูลรับรองการเข้าสู่ระบบ และบางส่วนไม่จำเป็นต้องใช้ หากแต่ละอินเทอร์เฟซไม่ได้รับการจัดการอย่างเหมาะสม เราจะพิจารณาสกัดกั้นและสรุปคำขอได้หรือไม่ [บทช่วยสอนที่เกี่ยวข้องที่แนะนำ: "บทช่วยสอนเชิงมุม"]
บทความนี้จะถูกนำมาใช้
เพื่อแยกความแตกต่างระหว่างสภาพแวดล้อม
เราจำเป็นต้องสกัดกั้นบริการในสภาพแวดล้อมที่แตกต่างกัน เมื่อใช้ angular-cli เพื่อสร้างโปรเจ็กต์ ระบบจะแยกแยะสภาพแวดล้อมโดยอัตโนมัติในไดเรกทอรี app/enviroments :
สภาพแวดล้อม ├── สภาพแวดล้อม.prod.ts // การกำหนดค่าที่ใช้ในสภาพแวดล้อมการผลิต └── สภาพแวดล้อม ts // การกำหนดค่าที่ใช้ในสภาพแวดล้อมการพัฒนา
มาแก้ไขสภาพแวดล้อมการพัฒนากันเถอะ:
// enviroment.ts
ส่งออกสภาพแวดล้อม const = {
URL ฐาน: '',
การผลิต: เท็จ
}; baseUrl คือช่องที่เพิ่มไว้หน้าคำขอเมื่อคุณส่งคำขอ โดยจะชี้ไปยังที่อยู่ที่คุณต้องการขอ ฉันไม่ได้เพิ่มอะไรเลย จริงๆ แล้วมันก็เทียบเท่ากับการเพิ่มเนื้อหาของ http://localhost:4200
แน่นอนว่าเนื้อหาที่คุณเพิ่มที่นี่จะต้องถูกปรับให้ตรงกับเนื้อหาที่เพิ่มในพรอกซีของคุณ ผู้อ่านสามารถคิดและตรวจสอบได้ด้วยตัวเอง
เพิ่ม
บริการดักจับ http-interceptor.service.ts คำขอจะผ่านบริการนี้
// http-interceptor.service.ts
นำเข้า { ฉีดได้ } จาก '@ เชิงมุม/แกน';
นำเข้า {
เหตุการณ์ Http,
HttpHandler,
HttpInterceptor, // Interceptor HttpRequest, // คำขอ} จาก '@ เชิงมุม/common/http';
นำเข้า { สังเกตได้ } จาก 'rxjs';
นำเข้า { แตะ } จาก 'rxjs/operators';
นำเข้า { สภาพแวดล้อม } จาก 'src/environments/environment';
@ฉีด({
ให้ไว้ใน: 'ราก'
-
คลาสส่งออก HttpInterceptorService ใช้ HttpInterceptor {
ตัวสร้าง () { }
สกัดกั้น (คำขอ: HttpRequest <ใด ๆ > ถัดไป: HttpHandler): สังเกตได้ <HttpEvent <ใด ๆ>> {
ให้ SecureReq: HttpRequest<any> = req;
SecureReq = SecureReq.clone({
URL: สภาพแวดล้อม.baseUrl + req.url
-
กลับ next.handle (secureReq).pipe(
แตะ(
(ตอบกลับ: ใด ๆ ) => {
// ประมวลผลข้อมูลการตอบสนอง console.log(response)
-
(ข้อผิดพลาด: ใด ๆ ) => {
// จัดการข้อมูลข้อผิดพลาด console.log (ข้อผิดพลาด)
-
-
-
-
} เพื่อให้ interceptor มีผล เราต้องฉีดมันไปที่ app.module.ts :
// app.module.ts
นำเข้า { HttpClientModule, HTTP_INTERCEPTORS } จาก '@ เชิงมุม/common/http';
//นำเข้าบริการ Interceptor { HttpInterceptorService } จาก './services/http-interceptor.service';
ผู้ให้บริการ: [
// การฉีดพึ่งพา {
ให้: HTTP_INTERCEPTORS,
useClass: HttpInterceptorService,
หลาย: จริง,
-
] การยืนยัน
ณ จุดนี้ เราได้ติดตั้ง Interceptor สำเร็จแล้ว หากคุณรัน npm run dev คุณจะเห็นข้อความต่อไปนี้บนคอนโซล:

เพื่อตรวจสอบว่าจำเป็นต้องใช้ข้อมูลรับรองเนื้อหาเพื่อเข้าถึงเนื้อหาหรือไม่ ฉันใช้อินเทอร์เฟซ [post] https://jimmyarea.com/api/private/leave/message เพื่อลองและได้รับข้อผิดพลาดต่อไปนี้:

แบ็กเอนด์ได้ประมวลผลแล้วว่าอินเทอร์เฟซนี้ต้องใช้ข้อมูลรับรองจึงจะทำงานได้ จึงมีการรายงานข้อผิดพลาด 401 โดยตรง
เอาล่ะ มาถึงปัญหาแล้ว หลังจากที่เราเข้าสู่ระบบแล้ว เราต้องนำข้อมูลประจำตัวของเรามาอย่างไร?
ดังต่อไปนี้ เราแก้ไขเนื้อหา interceptor:
ให้ SecureReq: HttpRequest<any> = req;
-
// ใช้ localhost เพื่อจัดเก็บข้อมูลรับรองผู้ใช้ในส่วนหัวของคำขอ if (window.localStorage.getItem('ut')) {
ให้โทเค็น = window.localStorage.getItem('ut') ||. ''
SecureReq = SecureReq.clone({
ส่วนหัว: req.headers.set('โทเค็น', โทเค็น)
-
-
// ... ระยะเวลาที่ถูกต้องของใบรับรองนี้ต้องการให้ผู้อ่านตัดสินว่าระยะเวลาที่ถูกต้องเมื่อเข้าสู่ระบบแล้วพิจารณารีเซ็ตค่าของ localstorage มิฉะนั้นข้อผิดพลาดจะถูกรายงานเสมอ สิ่งนี้ก็ง่ายมากเช่นกัน การห่อหุ้ม localstorage สะดวกต่อการใช้งาน ใช่~
[สิ้นสุด]