web-dev-qa-db-fra.com

AngularJS $ http.POST method 405 error

Dans la méthode $ http.post j'obtiens un problème 405. Nous utilisons un service unique (REST) ​​pour les deux méthodes POST & GET. 

si url ayant localhost cela fonctionne. urlAddScenario est localhost/Service.svc/api/scénarios/add. Si j'utilise le nom de la machine au lieu de locahost, cela ne fonctionne pas. machinname/Service.svc/api/scenarii/add 

Mon code JS est

 scenarioExecutionFactory.addScenario = function (scenarioId) {
        return $http.post(urlAddScenario, scenarioId)               
    };

autreJS:

 var runScenarioId = { "ScenarioId": 10 }
                   scenarioExecutionFactory.addScenario(runScenarioId )
                         .success(function (data) {
                             $scope.getScenarioRecentRuns($scope.CurrentScenario);
                         });

Service WCF: 

  [OperationContract]
        [WebInvoke(UriTemplate = "api/scenarios/add",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            Method = "POST")]
        Request AddScenario(ScenarioRequestParams requestParams);

config:

   <system.webServer>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Credentials" value="true" />
    <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,OPTIONS" />
    <add name="Access-Control-Allow-Headers" value="Origin,Content-Type,Accept,Authorization,X-Ellucian-Media-Type" />
  </customHeaders>

</httpProtocol>

Je vois des OPTIONS au lieu de POST dans les en-têtes.

En-têtes:

**OPTIONS** http://ddd/HelloService/HelloService.svc/PostData HTTP/1.1
Accept: */*
Origin: http://localhost:31284
Access-Control-Request-Method: POST
Access-Control-Request-Headers: accept, content-type
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko
Host: vijayakatta
Content-Length: 0
DNT: 1
Connection: Keep-Alive
Pragma: no-cache

Erreur:

IE: SCRIPT7002: XMLHttpRequest: erreur réseau 0x80070005, l'accès est refusé.

Chrome: XMLHttpRequest ne peut pas charger htp // nom_ordinateur/services.svc/api/scénarios/add. Code d'état HTTP non valide 405

En-têtes de réponse: HTTP/1.1 405, méthode non autorisée

7
user3194721

Pour activer correctement CORS via web.config, vous devez spécifier ces 3 en-têtes personnalisés.

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  </customHeaders>
</httpProtocol>

Si vous envisagez de prendre en charge les verbes PUT et DELETE, vous devez également gérer le preflight check. Vous pouvez en savoir plus sur CORS et contrôle en amont dans cette réponse: https://stackoverflow.com/a/27374066/4304188

Solution:

$http({
    url: "",
    method: "POST",
    data: $.param({
        data1: ""       
    }),
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});

Je faisais également face à ce problème. Obtenait 405 et OPTIONS a été faite. Je suis tombé sur un blog et j'ai constaté que le serveur Web ne comprenait pas correctement la façon dont l'encodage angulaire codait. Donc, jQuery est nécessaire pour encoder les données POST

1
govindc

Erreur de ma part, je devais simplement remove method="post" action="" 

Mauvais: <form ng-submit="doSubmit()" name="myform" method="post" action="" role="form">

Bon: <form ng-submit="doSubmit()" name="myform" role="form">

0
Robot70