角-cli 服务器-如何代理 API 请求到另一个服务器?

使用 angular-cli ng serve本地开发服务器,它提供来自我的项目目录的所有静态文件。

我如何代理我的 AJAX 调用到不同的服务器?

300659 次浏览

编辑: 这不再工作,在目前的角-CLI

有关最新解决方案,请参见其他答案


The server in angular-cli comes from the ember-cli project. To configure the server, create an .ember-cli file in the project root. Add your JSON config in there:

{
"proxy": "https://api.example.com"
}

重新启动服务器,它将代理那里的所有请求。

For example, I'm making relative requests in my code to /v1/foo/123, which is being picked up at https://api.example.com/v1/foo/123.

您还可以在启动服务器时使用一个标志: ng serve --proxy https://api.example.com

当前角-cli 版本: 1.0.0-beta.0

更新日期2022

官方推荐的方法现在是 这里记录的那个

2017年最新情况

现在可以使用更好的文档,您可以同时使用这两种方法 基于 JSON 和 JavaScript 的配置: < a href = “ https://github.com/angle/angle-cli/pull/1896”rel = “ noReferrer”> angle-cli 文档代理

Https 代理配置示例

{
"/angular": {
"target":  {
"host": "github.com",
"protocol": "https:",
"port": 443
},
"secure": false,
"changeOrigin": true,
"logLevel": "info"
}
}

To my knowledge with Angular 2.0 release setting up proxies using .ember-cli file is not recommended. official way is like below

  1. 编辑你的 package.json"start"看下面

    "start": "ng serve --proxy-config proxy.conf.json",

  2. 在项目的根目录中创建一个名为 proxy.conf.json的新文件,并在其中定义如下所示的代理

     {
    "/api": {
    "target": "http://api.yourdomai.com",
    "secure": false
    }
    }
    
  3. 重要的是使用 npm start而不是 ng serve

阅读更多: Proxy Setup Angular 2 cli

这几乎是为我工作。还必须补充:

"changeOrigin": true,
"pathRewrite": {"^/proxy" : ""}

proxy.conf.json全文如下:

{
"/proxy/*": {
"target": "https://url.com",
"secure": false,
"changeOrigin": true,
"logLevel": "debug",
"pathRewrite": {
"^/proxy": ""
}
}
}

我们可以在这里找到 Angular-CLI 的代理文档:

Https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/proxy.md

在根文件夹中设置名为 proxy.config.json 的文件后,编辑 package.json 以在 ng start 中包含代理配置。在脚本中添加“ start”: “ ng service —— proxy-config proxy.conf.json”之后,运行 npm start 而不是 ng service,因为这会忽略 package.json 中的标志设置。

当前版本的 angle-cli: 1.1.0

下面是另一个工作示例(@angle/cli 1.0.4) :

Proxy.con.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

当你需要更多灵活性时,这里有另一种代理方式:

You can use the 'router' option and some javascript code to rewrite the target URL dynamically. 为此,您需要在‘ start’脚本参数列表中指定一个 javascript 文件而不是 json 文件作为—— xy-conf 参数:

"start": "ng serve --proxy-config proxy.conf.js --base-href /"

如上所示,还需要将—— base-href 参数设置为/,否则,需要将 < base href = “ ...”> 设置为 index.html 中的路径。这个设置将覆盖它,并且有必要确保 http 请求中的 URL 被正确构造。

然后,您需要在 proxy.con.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。另一种方法是使用一些自定义代码分配函数,这就是我在这里的示例中演示的。在后一种情况下,我发现仍然需要将目标选项设置为某个值,以便路由器选项能够工作。如果你给路由器选项分配一个自定义函数,那么目标选项就不会被使用,所以它可以被设置为 true。否则,它需要成为默认的目标 URL。

Webpack 使用 http-proxy-midware,因此您可以在那里找到有用的文档: Https://github.com/chimurai/http-proxy-middleware/blob/master/readme.md#http-proxy-middleware-options

下面的示例将使用自定义函数作为路由器从 cookie 中获取开发人员名称,以确定目标 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;

(Cookie 设置为 localhost 和 path’/’,并且使用浏览器插件进行了长时间的保存。如果 Cookie 不存在,URL 将指向活动站点。)

It's important to note that the proxy path 将被附加 to whatever you configured as your target. So a configuration like this:

{
"/api": {
"target": "http://myhost.com/api,
...
}
}

http://localhost:4200/api这样的请求将导致对 http://myhost.com/api/api的调用。我认为这里的意图是在开发和生产环境之间不要有两条不同的路径。所有您需要做的就是使用 /api作为您的基本 URL。

因此,正确的方法是简单地使用 api 路径之前的部分,在本例中只使用主机地址:

{
"/api": {
"target": "http://myhost.com",
...
}
}

我将在下面的例子中解释你的 需要知道:

{
"/folder/sub-folder/*": {
"target": "http://localhost:1100",
"secure": false,
"pathRewrite": {
"^/folder/sub-folder/": "/new-folder/"
},
"changeOrigin": true,
"logLevel": "debug"
}
}
  1. 路径说: 当我在角度应用程序中看到这个路径时(路径可以存储在任何地方) ,我想对它做些什么。* 字符表示子文件夹后面的所有内容都将包含在内。例如,如果在 /文件夹/子文件夹/中有多种字体,* 将选择所有字体

  2. “ target” : “ http://localhost:1100" ,对于上面的路径,使 目标 URL 成为主机/源,因此在后台我们会有 http://localhost:1100/folder/sub-folder/

  3. “ pathRewrite ”: { “ ^/文件夹/子文件夹/”: “/新文件夹/” }, 现在让我们假设你想在本地测试你的应用程序,url http://localhost:1100/folder/sub-folder/可能包含一个无效的路径:/file/sub-file/。如果你想改变路径为正确的 http://localhost:1100/new-folder/路径,那么 pathRewrite 将变得非常有用。它将排除应用程序中的路径(左侧) ,并包括新编写的路径(右侧)

  4. “ security” : 表示我们使用的是 http 还是 https。如果在目标属性中使用 https,则将 security 属性设置为 true,否则将其设置为 false

  5. “ changeOrigin” : 只有当主机目标不是当前环境时,才需要选项,例如: localhost。如果您想将主机更改为 Www.something.com,这将是代理中的目标,那么将 changeOrigin 属性设置为“ true”:

  6. “ logLevel” : 属性指定开发人员是否希望在其终端/cmd 上显示代理,因此他将使用图像中显示的“ debug”值

通常,代理有助于在本地开发应用程序。你为生产目的设置你的文件路径,如果你有所有这些文件在你的项目本地,你可以只是使用代理访问它们,而不改变路径动态在你的应用程序。

如果它可以工作,您应该在 cmd/终端中看到类似的内容。

enter image description here

  1. 添加 proxy.config.json,所有对/api 的请求都将被重定向到 httt://targetIP: targetPort/api。
{
"/api": {
"target": "http://targetIP:targetPort",
"secure": false,
"pathRewrite": {"^/api" : targeturl/api},
"changeOrigin": true,
"logLevel": "debug"
}
}
  1. 包装好了 Json 制作 "start": "ng serve --proxy-config proxy.conf.json"

  2. 用密码 let url = "/api/clnsIt/dev/78"; 这个网址会被翻译成 http://targetip:targetport/api/clnsit/dev/78。

  3. You can also force rewrite by filling the pathRewrite. This is the link for details Cmd/NPM 控制台会记录“ rewrite path from”/api/...”到“ http://targeturl:targetport/api/.."”,而浏览器控制台会记录“ http://loclahost/api"”;

科尔斯-起源问题截图

Cors 问题已经在我的申请中面临。参考上面的截图。添加代理配置之后,问题已经解决。我的应用程序 url: localhost: 4200并请求 api url: “ http://www.datasciencetoolkit.org/maps/api/geocode/json?sensor=false&address=

Api side no-cors permission allowed. And also I'm not able to change cors-issue in server side and I had to change only in angular(client side).

解决步骤:

  1. 在 src 文件夹中创建 proxy.con.json 文件。
   {
"/maps/*": {
"target": "http://www.datasciencetoolkit.org",
"secure": false,
"logLevel": "debug",
"changeOrigin": true
}
}
  1. 阿皮要求的
this.http
.get<GeoCode>('maps/api/geocode/json?sensor=false&address=' + cityName)
.pipe(
tap(cityResponse => this.responseCache.set(cityName, cityResponse))
);

注意: 我们在 Api 请求中跳过了主机名 url,它会在给出请求时自动添加。无论何时更改 proxy.con.js,我们都必须重新启动 n- 服务,那么只有更改才会更新。

  1. 在 angular.json 中配置代理
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "TestProject:build",
"proxyConfig": "src/proxy.conf.json"
},
"configurations": {
"production": {
"browserTarget": "TestProject:build:production"
}
}
},

完成这些步骤后,重新启动 n- 服务 代理正常工作,请参阅此处

> 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

In case if someone is looking for multiple context entries to the same target or TypeScript based configuration.

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 service —— proxy-config = ./proxy.config.ts-o

步骤1: 转到根文件夹 CreateProxy Conf.json

{
"/auth/*": {
"target": "http://localhost:8000",
"secure": false,
"logLevel": "debug",
"changeOrigin": true
}
}

步骤2: 转到 package.json,在“ start”下面查找“ script”

"start": "ng serve --proxy-config proxy.conf.json",

Step 3:now add /auth/ in your http

 return this.http
.post('/auth/register/', { "username": 'simolee12', "email": 'xyz@gmail.com', "password": 'Anything@Anything' });
}

步骤4: 运行 Terminal的最后一步 NPM 开始

目前,从角度12开始,官方的方法是这样的:

在项目的 /src文件夹中创建一个名为 proxy.conf.json的文件,并使用它来定义代理:

    {
"/api": {
"target": "http://api.yourdomai.com",
"secure": false
}
}

更改 angular.json文件以在运行代理时包含该代理:

...
"architect": {
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "your-application-name:build",
"proxyConfig": "src/proxy.conf.json"
},
...

请注意,您可以按照配置设置该代理,因此如果您只想在您的开发环境中配置代理(通常在生产环境中,您会使用 HTTP 服务器来管理代理) ,那么您可以这样配置它:

...
"architect": {
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"production": {
"browserTarget": "your-application-name:build",
},
"development": {
"browserTarget": "your-application-name:build",
"proxyConfig": "src/proxy.conf.json"
},
...

现在,当您运行 ng serve时,它将正确地代理请求。

The full documentation is here : 构建和服务到后端服务器的角度代理