web-dev-qa-db-fra.com

La réponse au contrôle en amont est un code de statut HTTP non valide 400

J'essaie de passer un appel REST (POST) à l'aide d'AJAX. Ceci est mon code AJAX

<script>
var settings = {
"async": true,
"crossDomain": true,
"dataType": "json",
"url": "http://localhost:port/service/myservice",
"method": "POST",
"data": '{jsondata}',
"headers": {
      "accept": "application/json",
      "Authorization": "authValue"
  }
}

$.ajax(settings)

.done(function (response) {
  console.log(response);
});
</script>

Au départ, j'ai eu cette erreur: XMLHttpRequest ne peut pas charger http: // localhost: port/service/myservice . La réponse à la demande de contrôle en amont ne réussit pas la vérification du contrôle d'accès: aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée. Origin 'null' n'est donc pas autorisé à accéder. La réponse avait le code de statut HTTP 400.

Pour résoudre ce problème, j'ai ajouté le code suivant dans mon application dropwizard.

Dynamic filter = env.servlets().addFilter("CORS", CrossOriginFilter.class);

filter.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,PUT,POST,DELETE,OPTIONS");
filter.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
    filter.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_Origin_HEADER, "*");
filter.setInitParameter("allowedHeaders", "Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin");
filter.setInitParameter("allowCredentials", "true");

filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");

Après avoir ajouté ceci, mon exception initiale a disparu, mais je reçois l'exception suivante: XMLHttpRequest ne peut pas charger http: // localhost: port/service/myservice . La réponse au contrôle en amont a un code de statut HTTP non valide 400

Ce problème est-il lié à la SCRO? Qu'est-ce que je fais mal ici?

UPDATE

Après avoir fait plus de débogage, j'ai trouvé ce comportement. Lors de l'envoi de la demande sans l'en-tête Authorization, le message 415 (type de support non pris en charge) error.

Je pense que quelque chose ne va pas avec mon code AJAX, quelqu'un peut-il m'aider, s'il vous plaît, à trouver le problème? Merci.

5
Roy Justin

Vous pouvez essayer ici mentionné comme réponse complète dans ce fil.

$.ajax({
        type:"POST",
        beforeSend: function (request)
        {
            request.setRequestHeader("Authority", authValue);
        },
        url: "http://localhost:port/service/myservice",
        data: "json=" + escape(JSON.stringify(createRequestObject)),
        processData: false,
        success: function(msg) {
            $("#results").append("The result =" + StringifyPretty(msg));
        }
});
1
Siva Shibhi

essayez d'ajouter ce qui suit à vos paramètres?

xhrFields: { withCredentials: true }
0
Natural Lam

si vous devez transmettre des données JSON à l'appel AJAX, vous devez spécifier le type de contenu comme json/application afin que le serveur sache que vous essayez d'envoyer des données JSON. Mais cela changera le type de contenu par défaut de l'appel et l'appel sera qualifié pour la vérification avant le vol, qui nécessite une demande appropriée du client et du serveur compatible CORS.

Pour un cas d'utilisation plus simple, n'utilisez pas JSON.stringify () lorsque vous transmettez des données, créez simplement une chaîne au format {key: value, key: value, ...} et transmettez-la en tant que données. L'appel Ajax sérialise les données par défaut et agit comme il convient. L'appel reste en tant qu'appel unique POST sur le serveur, où le mode pré-vol correspond à deux appels.

0
srinivas