Regardez attentivement la différence de requête entre vos deux requêtes. Je parle de la partie type de contenu par défaut de jquery est application/x-www-form-urlencoded, qui est une requête simple. Un contrôle en amont est requis (ce qui correspond à la demande d'options dans la deuxième image). Le type de contenu par défaut de la requête de publication d'Angular est application/json. Il s'agit d'une requête complexe, principalement pour le contrôle en amont. Mais puisque vous rencontrez une erreur, cela signifie que votre backend ne gère pas la situation des options :
.
Définissez manuellement l'en-tête de votre service de ressources angulaires et modifiez le type de contenu en application/x-www-form-urlencoded. (Je ne sais pas si les ressources peuvent personnaliser l'en-tête, car les ressources sont en fait des services de repos standard)
Demandez à votre programme back-end d'apporter les modifications correspondantes pour lui permettre de gérer des requêtes complexes (en fait, de très petites modifications, que Java, Python ou Ruby on Rails aient des solutions prêtes à l'emploi)
Veuillez noter que lorsque vous utilisez jquery pour envoyer une requête, les en-têtes de réponse sont définis sur Access-Control-Allow-Origin, vous pouvez donc traverser les domaines ;
Mais lorsque vous l'envoyez avec Angular, cet en-tête n'est pas là. Il se peut que la logique de votre réponse côté serveur ait fait un certain jugement, ce qui fait que cet en-tête n'est pas défini normalement.
@Evian Ce n'est pas qu'Angular pense qu'un contrôle en amont est nécessaire, mais que le navigateur pense (en raison de la configuration d'Angular des requêtes HTTP, Content-Type et Cache-Control, selon la documentation MDN) que le contrôle en amont doit être lancé .
@YAN_YANG À en juger par l'en-tête de réponse, votre serveur autorise les demandes de contrôle en amont. Vous pouvez le supprimer du serveur. Je ne sais pas comment vous avez configuré CORS. Par exemple, il existe un paramètre similaire dans Apache :
Header set Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
Supprimer l'option OPTIONS peut directement éviter de répondre au contrôle en amont. Bien sûr, il est correct que vous le gériez de manière raisonnable. (Voir : http://stackoverflow.com/questions/23954433/post-request-with-angularj...)
De plus, avez-vous défini les en-têtes de requête corrects sur Angular ? (pour CORS)
Cet article explique les différents problèmes avec OPTIONS et pourquoi jQuery convient (HEADER est spécifiquement supprimé pour CORS). Il existe également une implémentation Java CORS et le paramétrage de HEADER lors des requêtes. Comment configurer Angular ? Consultez simplement la documentation de $httpProvider.
Regardez attentivement la différence de requête entre vos deux requêtes. Je parle de la partie type de contenu par défaut de jquery est application/x-www-form-urlencoded, qui est une requête simple. Un contrôle en amont est requis (ce qui correspond à la demande d'options dans la deuxième image). Le type de contenu par défaut de la requête de publication d'Angular est application/json. Il s'agit d'une requête complexe, principalement pour le contrôle en amont. Mais puisque vous rencontrez une erreur, cela signifie que votre backend ne gère pas la situation des options :
.Définissez manuellement l'en-tête de votre service de ressources angulaires et modifiez le type de contenu en application/x-www-form-urlencoded. (Je ne sais pas si les ressources peuvent personnaliser l'en-tête, car les ressources sont en fait des services de repos standard)
Demandez à votre programme back-end d'apporter les modifications correspondantes pour lui permettre de gérer des requêtes complexes (en fait, de très petites modifications, que Java, Python ou Ruby on Rails aient des solutions prêtes à l'emploi)
Veuillez noter que lorsque vous utilisez jquery pour envoyer une requête, les en-têtes de réponse sont définis sur Access-Control-Allow-Origin, vous pouvez donc traverser les domaines
; Mais lorsque vous l'envoyez avec Angular, cet en-tête n'est pas là. Il se peut que la logique de votre réponse côté serveur ait fait un certain jugement, ce qui fait que cet en-tête n'est pas défini normalement.
@Evian Ce n'est pas qu'Angular pense qu'un contrôle en amont est nécessaire, mais que le navigateur pense (en raison de la configuration d'Angular des requêtes HTTP,
Content-Type
etCache-Control
, selon la documentation MDN) que le contrôle en amont doit être lancé .@YAN_YANG À en juger par l'en-tête de réponse, votre serveur autorise les demandes de contrôle en amont. Vous pouvez le supprimer du serveur. Je ne sais pas comment vous avez configuré CORS. Par exemple, il existe un paramètre similaire dans Apache :
Supprimer l'option
OPTIONS
peut directement éviter de répondre au contrôle en amont. Bien sûr, il est correct que vous le gériez de manière raisonnable. (Voir : http://stackoverflow.com/questions/23954433/post-request-with-angularj...)De plus, avez-vous défini les en-têtes de requête corrects sur Angular ? (pour CORS)
http://chstrongjavablog.blogspot.sg/2013/04/enabling-cors-for-jetty.ht...
Cet article explique les différents problèmes avec OPTIONS et pourquoi jQuery convient (HEADER est spécifiquement supprimé pour CORS). Il existe également une implémentation Java CORS et le paramétrage de HEADER lors des requêtes. Comment configurer Angular ? Consultez simplement la documentation de
$httpProvider
.