ด้วยangular-cli
ng serve
เซิร์ฟเวอร์ dev ภายในเครื่องจะให้บริการไฟล์แบบคงที่ทั้งหมดจากไดเรกทอรีโครงการของฉัน
ฉันจะพร็อกซีการเรียก AJAX ไปยังเซิร์ฟเวอร์อื่นได้อย่างไร
ด้วยangular-cli
ng serve
เซิร์ฟเวอร์ dev ภายในเครื่องจะให้บริการไฟล์แบบคงที่ทั้งหมดจากไดเรกทอรีโครงการของฉัน
ฉันจะพร็อกซีการเรียก AJAX ไปยังเซิร์ฟเวอร์อื่นได้อย่างไร
คำตอบ:
ขณะนี้มีเอกสารที่ดีขึ้นและคุณสามารถใช้ทั้งการกำหนดค่าตาม JSON และ JavaScript: พร็อกซีเอกสารเชิงมุม
ตัวอย่างการกำหนดค่าพร็อกซี https
{
"/angular": {
"target": {
"host": "github.com",
"protocol": "https:",
"port": 443
},
"secure": false,
"changeOrigin": true,
"logLevel": "info"
}
}
สำหรับความรู้ของฉันเกี่ยวกับ Angular 2.0 release ไม่แนะนำให้ตั้งค่าพร็อกซีโดยใช้ไฟล์ .ember-cli อย่างเป็นทางการเหมือนด้านล่าง
แก้ไข"start"
ของคุณpackage.json
เพื่อดูด้านล่าง
"start": "ng serve --proxy-config proxy.conf.json",
สร้างไฟล์ใหม่ที่เรียกว่าproxy.conf.json
ในรูทของโปรเจ็กต์และภายในไฟล์นั้นจะกำหนดพร็อกซีของคุณดังต่อไปนี้
{
"/api": {
"target": "http://api.yourdomai.com",
"secure": false
}
}
สิ่งสำคัญคือคุณใช้npm start
แทนng serve
อ่านเพิ่มเติมจากที่นี่: Proxy Setup Angular 2 cli
/api/api/person
ความคิดใด ๆ ว่าทำไมสิ่งนี้จึงเกิดขึ้น
ฉันจะอธิบายสิ่งที่คุณต้องรู้ในตัวอย่างด้านล่าง:
{
"/folder/sub-folder/*": {
"target": "http://localhost:1100",
"secure": false,
"pathRewrite": {
"^/folder/sub-folder/": "/new-folder/"
},
"changeOrigin": true,
"logLevel": "debug"
}
}
/ folder / sub-folder / *: path บอกว่า: เมื่อฉันเห็นพา ธ นี้ในแอพเชิงมุมของฉัน (สามารถเก็บพา ธ ได้ทุกที่) ฉันต้องการทำอะไรบางอย่างกับมัน อักขระ * ระบุว่าทุกสิ่งที่อยู่ถัดจากโฟลเดอร์ย่อยจะรวมอยู่ด้วย ตัวอย่างเช่นหากคุณมีแบบอักษรหลายแบบใน/ โฟลเดอร์ / โฟลเดอร์ย่อย / * จะเลือกแบบอักษรทั้งหมด
"target" : "http: // localhost: 1100" สำหรับเส้นทางด้านบนทำให้ URL เป้าหมายเป็นโฮสต์ / แหล่งที่มาดังนั้นในพื้นหลังเราจะมี http: // localhost: 1100 / folder / sub-folder /
"pathRewrite ": {"^ / folder / sub-folder /": "/ new-folder /"} สมมติว่าคุณต้องการทดสอบแอปของคุณในเครื่อง URL http: // localhost: 1100 / folder / sub -folder / อาจมีเส้นทางที่ไม่ถูกต้อง: / โฟลเดอร์ / โฟลเดอร์ย่อย /. คุณต้องการเปลี่ยนเส้นทางนั้นเป็นเส้นทางที่ถูกต้องซึ่งก็คือ http: // localhost: 1100 / new-folder / ดังนั้น pathRewrite จะมีประโยชน์ จะไม่รวมเส้นทางในแอป (ด้านซ้าย) และรวมเส้นทางที่เขียนใหม่ (ด้านขวา)
"ปลอดภัย" : แสดงว่าเรากำลังใช้ http หรือ https หากใช้ https ในแอตทริบิวต์เป้าหมายให้ตั้งค่าแอตทริบิวต์ที่ปลอดภัยเป็น true หรือตั้งค่าเป็นเท็จ
"changeOrigin" : อ็อพชันจำเป็นก็ต่อเมื่อเป้าหมายโฮสต์ของคุณไม่ใช่สภาพแวดล้อมปัจจุบันตัวอย่างเช่น localhost หากคุณต้องการเปลี่ยนโฮสต์เป็นwww.something.comซึ่งจะเป็นเป้าหมายในพร็อกซีให้ตั้งค่าแอตทริบิวต์ changeOrigin เป็น "true":
"logLevel" : แอตทริบิวต์ระบุว่าผู้พัฒนาต้องการแสดงพร็อกซีบนเทอร์มินัล / cmd ของเขาดังนั้นเขาจะใช้ค่า "debug" ตามที่แสดงในภาพ
โดยทั่วไปพร็อกซีจะช่วยในการพัฒนาแอปพลิเคชันภายในเครื่อง คุณกำหนดเส้นทางไฟล์สำหรับวัตถุประสงค์ในการผลิตและหากคุณมีไฟล์เหล่านี้ทั้งหมดภายในโปรเจ็กต์ของคุณคุณก็สามารถใช้พร็อกซีเพื่อเข้าถึงได้โดยไม่ต้องเปลี่ยนเส้นทางแบบไดนามิกในแอปของคุณ
หากใช้งานได้คุณจะเห็นสิ่งนี้ใน cmd / terminal ของคุณ
นี่ใกล้จะทำงานให้ฉันแล้ว ยังต้องเพิ่ม:
"changeOrigin": true,
"pathRewrite": {"^/proxy" : ""}
เต็มรูปแบบproxy.conf.json
ที่แสดงด้านล่าง:
{
"/proxy/*": {
"target": "https://url.com",
"secure": false,
"changeOrigin": true,
"logLevel": "debug",
"pathRewrite": {
"^/proxy": ""
}
}
}
แก้ไข: ไม่ทำงานอีกต่อไปในปัจจุบัน ANGULAR-CLI
ดูคำตอบจาก @imal hasaranga perera สำหรับวิธีการแก้ปัญหาที่ทันสมัย
เซิร์ฟเวอร์ในangular-cli
มาจากember-cli
โครงการ ในการกำหนดค่าเซิร์ฟเวอร์ให้สร้าง.ember-cli
ไฟล์ในรูทโปรเจ็กต์ เพิ่มการกำหนดค่า JSON ของคุณที่นั่น:
{
"proxy": "https://api.example.com"
}
รีสตาร์ทเซิร์ฟเวอร์และจะพร็อกซีคำขอทั้งหมดที่นั่น
ตัวอย่างเช่นฉันทำคำขอญาติในรหัสของฉันไปซึ่งจะถูกหยิบขึ้นมาที่/v1/foo/123
https://api.example.com/v1/foo/123
คุณยังสามารถใช้แฟล็กเมื่อคุณเริ่มเซิร์ฟเวอร์:
ng serve --proxy https://api.example.com
ปัจจุบันสำหรับเวอร์ชัน angular-cli: 1.0.0-beta.0
ember-cli
อยู่ภายใต้ประทุน (สำหรับตอนนี้ต่อไป) ดังนั้นอาจจะดูเอกสาร บุคคลนี้ดูเหมือนจะมีตัวอย่างของพร็อกซีที่กำหนดเองที่รันอยู่: stackoverflow.com/q/30267849/227622
นี่คืออีกวิธีหนึ่งในการพร็อกซีเมื่อคุณต้องการความยืดหยุ่นมากขึ้น:
คุณสามารถใช้ตัวเลือก "เราเตอร์" และรหัสจาวาสคริปต์เพื่อเขียน URL เป้าหมายใหม่แบบไดนามิก สำหรับสิ่งนี้คุณต้องระบุไฟล์ javascript แทนไฟล์ json เป็นพารามิเตอร์ --proxy-conf ในรายการพารามิเตอร์สคริปต์ 'start' ของคุณ:
"start": "ng serve --proxy-config proxy.conf.js --base-href /"
ดังที่แสดงไว้ด้านบนพารามิเตอร์ --base-href ยังต้องตั้งค่าเป็น / ถ้าคุณตั้งค่า <base href = "... "> เป็นเส้นทางใน index.html ของคุณ การตั้งค่านี้จะลบล้างสิ่งนั้นและจำเป็นต้องตรวจสอบให้แน่ใจว่า URL ในคำขอ http สร้างขึ้นอย่างถูกต้อง
จากนั้นคุณต้องมีเนื้อหาต่อไปนี้หรือเนื้อหาที่คล้ายกันใน proxy.conf.js ของคุณ (ไม่ใช่ json!):
const PROXY_CONFIG = {
"/api/*": {
target: https://www.mydefaulturl.com,
router: function (req) {
var target = 'https://www.myrewrittenurl.com'; // or some custom code
return target;
},
changeOrigin: true,
secure: false
}
};
module.exports = PROXY_CONFIG;
โปรดทราบว่าตัวเลือกเราเตอร์สามารถใช้ได้สองวิธี หนึ่งคือเมื่อคุณกำหนดอ็อบเจ็กต์ที่มีคู่คีย์ค่าโดยที่คีย์คือโฮสต์ / พา ธ ที่ร้องขอเพื่อจับคู่และค่าคือ URL เป้าหมายที่เขียนใหม่ อีกวิธีหนึ่งคือเมื่อคุณกำหนดฟังก์ชันด้วยโค้ดที่กำหนดเองซึ่งเป็นสิ่งที่ฉันแสดงให้เห็นในตัวอย่างของฉันที่นี่ ในกรณีหลังนี้ฉันพบว่าตัวเลือกเป้าหมายยังคงต้องตั้งค่าเป็นบางอย่างเพื่อให้ตัวเลือกเราเตอร์ทำงานได้ หากคุณกำหนดฟังก์ชันแบบกำหนดเองให้กับตัวเลือกเราเตอร์ระบบจะไม่ใช้ตัวเลือกเป้าหมายดังนั้นจึงสามารถตั้งค่าเป็นจริงได้ มิฉะนั้นจะต้องเป็น URL เป้าหมายเริ่มต้น
Webpack ใช้ http-proxy-middleware ดังนั้นคุณจะพบเอกสารที่มีประโยชน์ที่นี่: https://github.com/chimurai/http-proxy-middleware/blob/master/README.md#http-proxy-middleware-options
ตัวอย่างต่อไปนี้จะได้รับชื่อผู้พัฒนาจากคุกกี้เพื่อกำหนด URL เป้าหมายโดยใช้ฟังก์ชันที่กำหนดเองเป็นเราเตอร์:
const PROXY_CONFIG = {
"/api/*": {
target: true,
router: function (req) {
var devName = '';
var rc = req.headers.cookie;
rc && rc.split(';').forEach(function( cookie ) {
var parts = cookie.split('=');
if(parts.shift().trim() == 'dev') {
devName = decodeURI(parts.join('='));
}
});
var target = 'https://www.'+ (devName ? devName + '.' : '' ) +'mycompany.com';
//console.log(target);
return target;
},
changeOrigin: true,
secure: false
}
};
module.exports = PROXY_CONFIG;
(คุกกี้ถูกตั้งค่าสำหรับ localhost และ path '/' และมีการหมดอายุเป็นเวลานานโดยใช้ปลั๊กอินของเบราว์เซอร์หากไม่มีคุกกี้ URL จะชี้ไปที่ไซต์ที่ใช้งานอยู่)
เราสามารถค้นหาเอกสารพร็อกซีสำหรับ Angular-CLI ได้ที่นี่:
https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/proxy.md
หลังจากตั้งค่าไฟล์ชื่อ proxy.conf.json ในโฟลเดอร์รูทของคุณแล้วให้แก้ไข package.json ของคุณเพื่อรวมการกำหนดค่าพร็อกซีเมื่อเริ่มต้น ng หลังจากเพิ่ม "start": "ng serve --proxy-config proxy.conf.json" ในสคริปต์ของคุณแล้วให้เรียกใช้ npm start และไม่ใช่ ng serve เพราะจะไม่สนใจการตั้งค่าแฟล็กใน package.json ของคุณ
เวอร์ชันปัจจุบันของ angular-cli: 1.1.0
สิ่งสำคัญคือต้องทราบว่าเส้นทางพร็อกซีจะต่อท้ายสิ่งที่คุณกำหนดค่าเป็นเป้าหมายของคุณ ดังนั้นการกำหนดค่าเช่นนี้:
{
"/api": {
"target": "http://myhost.com/api,
...
}
}
และคำขอเช่นจะมีผลในการเรียกไปยังhttp://localhost:4200/api
http://myhost.com/api/api
ฉันคิดว่าเจตนาในที่นี้คือการไม่มีสองเส้นทางที่แตกต่างกันระหว่างการพัฒนาและสภาพแวดล้อมการผลิต สิ่งที่คุณต้องทำคือใช้/api
เป็น URL พื้นฐานของคุณ
ดังนั้นวิธีที่ถูกต้องคือใช้ส่วนที่มาก่อนพา ธ api ในกรณีนี้คือที่อยู่โฮสต์เท่านั้น:
{
"/api": {
"target": "http://myhost.com",
...
}
}
ในกรณีที่มีคนกำลังมองหารายการบริบทหลายรายการไปยังเป้าหมายเดียวกันหรือการกำหนดค่าตาม TypeScript
proxy.conf.ts
const proxyConfig = [
{
context: ['/api/v1', '/api/v2],
target: 'https://example.com',
secure: true,
changeOrigin: true
},
{
context: ['**'], // Rest of other API call
target: 'http://somethingelse.com',
secure: false,
changeOrigin: true
}
];
module.exports = proxyConfig;
ng ให้บริการ --proxy-config =. / proxy.conf.ts -o
ขั้นตอนที่ 1: ไปที่โฟลเดอร์รูทของคุณสร้างproxy.conf.json
{
"/auth/*": {
"target": "http://localhost:8000",
"secure": false,
"logLevel": "debug",
"changeOrigin": true
}
}
ขั้นตอนที่ 2: ไปที่package.jsonค้นหา "scripts" ภายใต้นั้นค้นหา "start"
"start": "ng serve --proxy-config proxy.conf.json",
ขั้นตอนที่ 3: ตอนนี้เพิ่ม / auth / ในhttpของคุณ
return this.http
.post('/auth/register/', { "username": 'simolee12', "email": 'xyz@gmail.com', "password": 'Anything@Anything' });
}
ขั้นตอนที่ 4: ขั้นตอนสุดท้ายในTerminal run npm start
นี่คือตัวอย่างการทำงานอื่น (@ angular / cli 1.0.4):
proxy.conf.json:
{
"/api/*" : {
"target": "http://localhost:8181",
"secure": false,
"logLevel": "debug"
},
"/login.html" : {
"target": "http://localhost:8181/login.html",
"secure": false,
"logLevel": "debug"
}
}
ทำงานด้วย:
ng serve --proxy-config proxy.conf.json
พบปัญหา Cors ในแอปพลิเคชันของฉัน อ้างอิงภาพหน้าจอด้านบน หลังจากเพิ่มปัญหาการกำหนดค่าพร็อกซีได้รับการแก้ไขแล้ว url แอปพลิเคชันของฉัน: localhost: 4200 และการขอ url api: " http://www.datasciencetoolkit.org/maps/api/geocode/json?sensor=false&address= "
อนุญาตให้ใช้สิทธิ์ no-cors ด้าน API และฉันไม่สามารถเปลี่ยนปัญหาคอร์ในฝั่งเซิร์ฟเวอร์ได้และฉันต้องเปลี่ยนเฉพาะในเชิงมุม (ฝั่งไคลเอ็นต์)
ขั้นตอนในการแก้ไข:
{ "/maps/*": { "target": "http://www.datasciencetoolkit.org", "secure": false, "logLevel": "debug", "changeOrigin": true } }
this.http .get<GeoCode>('maps/api/geocode/json?sensor=false&address=' + cityName) .pipe( tap(cityResponse => this.responseCache.set(cityName, cityResponse)) );
หมายเหตุ: เรามีการข้ามชื่อโฮสต์ url ในคำขอ Api ซึ่งจะเพิ่มอัตโนมัติในขณะที่ส่งคำขอ เมื่อใดก็ตามที่เปลี่ยน proxy.conf.js เราต้องรีสตาร์ท ng-serve จากนั้นจะอัปเดตการเปลี่ยนแปลงเท่านั้น
"serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { "browserTarget": "TestProject:build", "proxyConfig": "src/proxy.conf.json" }, "configurations": { "production": { "browserTarget": "TestProject:build:production" } } },
หลังจากเสร็จสิ้นขั้นตอนเหล่านี้ให้รีสตาร์ท ng-serve Proxy ทำงานได้อย่างถูกต้องตามที่คาดไว้โปรดดูที่นี่
> WARNING in
> D:\angular\Divya_Actian_Assignment\src\environments\environment.prod.ts
> is part of the TypeScript compilation but it's unused. Add only entry
> points to the 'files' or 'include' properties in your tsconfig.
> ** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ ** : Compiled
> successfully. [HPM] GET
> /maps/api/geocode/json?sensor=false&address=chennai ->
> http://www.datasciencetoolkit.org
{
"/api": {
"target": "http://targetIP:9080",
"secure": false,
"pathRewrite": {"^/proxy" : ""},
"changeOrigin": true,
"logLevel": "debug"
}
}
ใน package.json ให้ทำ
"start": "ng serve --proxy-config proxy.conf.json"
ในรหัสให้ url = "/ api / clnsIt / dev / 78"; URL นี้จะถูกแปลเป็น http: // targetIP: 9080 / api / clnsIt / dev / 78