106 votes

angular-cli server - comment proxyer les requêtes API vers un autre serveur ?

Avec le angular-cli ng serve serveur de développement local, il sert tous les fichiers statiques du répertoire de mon projet.

Comment puis-je proxyer mes appels AJAX vers un autre serveur ?

188voto

imal365 Points 39

À ma connaissance Angulaire de la version 2.0 configuration des proxys de l'aide .braise-cli fichier n'est pas recommandé. de manière officielle, c'est comme ci-dessous

  1. edit "start" de votre package.json à regarder ci-dessous

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

  2. créer un nouveau fichier appelé proxy.conf.json à la racine du projet et à l'intérieur, qui définissent votre procurations comme ci-dessous

    {
      "/api": {
        "target": "http://api.yourdomai.com",
        "secure": false
      }
    }
    
  3. Chose importante est que vous utilisez npm start au lieu de ng serve

Lire plus ici : Proxy Configuration Angulaire 2 cli

Mise à JOUR en 2017

Une meilleure documentation est maintenant disponible et vous pouvez l'utiliser à la fois JSON et JavaScript configurations: angulaire de la cli de la documentation proxy

exemple de configuration de proxy https

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

1 votes

Comment faites-vous avec des informations d'identification "non sécurisées". En utilisant node, je peux définir process.env.NODE_TLS_REJECT_UNAUTHORIZED à 0 et passer cette sécurité, mais je ne sais pas comment le faire avec le proxy.config.json. Il s'agit d'une pile de développement, cela ne me dérange pas si elle n'est pas sécurisée.

1 votes

Avoir "secure":false devrait suffire, ce devrait être un booléen et non une chaîne de caractères... j'ai passé un temps incalculable à garder "false".

0 votes

Cela fonctionne pour moi mais le proxy finit par être quelque chose comme /api/api/person Une idée de la raison pour laquelle cela se produit ?

66voto

eugen sunic Points 2937

Je vais vous expliquer ce que vous besoin de savoir sur l'exemple ci-dessous :

{
  "/folder/sub-folder/*": {
    "target": "http://localhost:1100",
    "secure": false,
    "pathRewrite": {
      "^/folder/sub-folder/": "/new-folder/"
    },
    "changeOrigin": true,
    "logLevel": "debug"
  }
}
  1. /dossier/sous-dossier/ * : path dit : Lorsque je vois ce chemin dans mon application angulaire (le chemin peut être stocké n'importe où), je veux faire quelque chose avec. Le caractère * indique que tout ce qui suit le sous-dossier sera inclus. Par exemple, si vous avez plusieurs polices dans le dossier /dossier/sous-dossier/ le * les ramassera tous

  2. "cible" : "http://localhost:1100" pour le chemin ci-dessus faire cible URL l'hôte/source, donc en arrière plan nous aurons http://localhost:1100/folder/sub-folder/

  3. "pathRewrite " : { "^/dossier/sous-dossier/" : "/nouveau-dossier/" }, Maintenant, disons que vous voulez tester votre application localement, l'url http://localhost:1100/folder/sub-folder/ peut contenir un chemin invalide : /folder/sub-folder/. Vous voulez changer ce chemin pour un chemin correct qui est http://localhost:1100/new-folder/, donc le pathRewrite deviendra utile. Elle exclura le chemin dans l'application (à gauche) et inclura le nouveau chemin écrit (à droite).

  4. "sécurisé" L'attribut secure : représente l'utilisation de http ou de https. Si https est utilisé dans l'attribut cible, alors l'attribut sécurisé est défini comme vrai, sinon il est défini comme faux.

  5. "changeOrigin" : l'option n'est nécessaire que si votre hôte cible n'est pas l'environnement actuel, par exemple : localhost. Si vous voulez changer l'hôte en www.something.com qui serait la cible dans le proxy, puis définissez l'attribut changeOrigin sur "true" :

  6. "logLevel" L'attribut "debug" spécifie si le développeur veut afficher le proxy dans son terminal/cmd, il doit donc utiliser la valeur "debug" comme indiqué dans l'image.

En général, le proxy aide à développer l'application localement. Vous définissez vos chemins d'accès aux fichiers à des fins de production et si vous avez tous ces fichiers localement dans votre projet, vous pouvez simplement utiliser le proxy pour y accéder sans changer le chemin d'accès dynamiquement dans votre application.

Si cela fonctionne, vous devriez voir quelque chose comme ceci dans votre cmd/terminal.

enter image description here

1 votes

Merci, c'est la bonne réponse pour la version actuelle d'Angular. L'option "changeOrigin" n'est nécessaire que si votre cible n'est pas localhost cependant. Vous devez également charger le fichier de configuration du proxy en exécutant le drapeau, ng serve --proxy-config proxy.conf.json Apparemment, il ignore l'indicateur dans le fichier package.json (comme dans les exemples précédents).

33voto

Tony Scialo Points 1109

C'était proche de fonctionner pour moi. Il fallait aussi ajouter :

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

Full proxy.conf.json montré ci-dessous :

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

0 votes

Cette réponse devrait être choisie pour la référence externe de l'API localement. Ce pathRewrite est ce qui résout un problème lors de la référence à l'EP externe, en remplaçant la référence par la cible.

12voto

elwyn Points 1271

EDIT : CELA NE FONCTIONNE PLUS DANS L'ACTUELLE ANGULAR-CLI

Voir la réponse de @imal hasaranga perera pour une solution actualisée.


Le serveur en angular-cli vient de la ember-cli projet. Pour configurer le serveur, créez un .ember-cli dans la racine du projet. Ajoutez-y votre configuration JSON :

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

Redémarrez le serveur et toutes les demandes seront traitées par le proxy.

Par exemple, je fais des requêtes relatives dans mon code pour /v1/foo/123 qui sera récupéré à https://api.example.com/v1/foo/123 .

Vous pouvez également utiliser un drapeau lorsque vous démarrez le serveur : ng serve --proxy https://api.example.com

Version actuelle pour angular-cli : 1.0.0-beta.0

1 votes

Merci pour votre réponse @elwyn. Est-il possible de ne donner un proxy qu'aux urls correspondant à un certain modèle, comme '/api/v1/' ?

0 votes

Je ne suis pas sûr - je n'ai pas eu besoin de le faire. Le serveur web est juste vanilla ember-cli sous le capot (pour l'instant, en tout cas), alors peut-être que vous pouvez consulter leur documentation ? Cette personne semble avoir un exemple de proxies personnalisés en cours d'exécution : stackoverflow.com/q/30267849/227622

0 votes

J'ai fait ça hier. Comme vous l'avez dit, il s'agit juste d'une ember-cli vanille. J'ai donc créé une application ember, généré un proxy (il n'y a pas encore de générateur disponible dans angular-cli) et copié dans mon application angular. Cela fonctionne bien. Merci.

3voto

Luuk Schoenmakers Points 476

Nous pouvons trouver la documentation du proxy pour Angular-CLI ici :

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

Après avoir configuré un fichier appelé proxy.conf.json dans votre dossier Root, modifiez votre package.json pour inclure la configuration du proxy au démarrage de ng. Après avoir ajouté "start" : "ng serve --proxy-config proxy.conf.json" à vos scripts, exécutez ng start et non ng serve, car cela ignorera le drapeau configuré dans votre package.json.

version actuelle d'angular-cli : 1.1.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X