AngularJS $http.POST 方法 405 错误

Posted

技术标签:

【中文标题】AngularJS $http.POST 方法 405 错误【英文标题】:AngularJS $http.POST method 405 error 【发布时间】:2015-02-07 20:21:30 【问题描述】:

在 $http.post 方法中,我遇到了 405 问题。我们对 POST 和 GET 方法都使用单一服务(REST)。

如果 url 具有 localhost 它正在工作。 urlAddScenario 是 localhost/Service.svc/api/scenarios/add。如果我使用机器名称而不是 locahost,则它不起作用。 machinname/Service.svc/api/scenarios/add

我的JS代码是

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

另一个JS:

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

WCF 服务:

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

配置:

   <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>

我在标题中看到的是 OPTIONS 而不是 POST。

标题:

**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

错误:

IE:SCRIPT7002:XMLHttpRequest:网络错误 0x80070005,访问被拒绝。

Chrome:XMLHttpRequest 无法加载 htp//machinename/services.svc/api/scenarios/add。 HTTP 状态码 405 无效

响应标头:HTTP/1.1 405 方法不允许

【问题讨论】:

查看这个问题的答案***.com/questions/17528634/… 【参考方案1】:

我的错误,我只需要删除 method="post" action=""

不好: &lt;form ng-submit="doSubmit()" name="myform" method="post" action="" role="form"&gt;

好: &lt;form ng-submit="doSubmit()" name="myform" role="form"&gt;

【讨论】:

【参考方案2】:

解决方案:

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

我也遇到过这个问题。得到 405 和 OPTIONS。我遇到了一个博客,发现 Web 服务器无法正确理解角度编码参数的方式。因此,需要 jQuery 对 POST 数据进行编码

【讨论】:

【参考方案3】:

为了通过web.config正确启用CORS,您需要指定这3个自定义标头

<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>

如果您计划支持 PUTDELETE 动词,您还需要处理 preflight 检查。 您可以在此答案中阅读有关CORS飞行前检查的更多信息:https://***.com/a/27374066/4304188

【讨论】:

您对 ScenarioRequestParams 的定义是什么?我的猜测是您以错误的方式构建您的发布请求。 您是否真的在使用 Web API,因为您已经发布了来自 ASMX Web 服务的代码。 param 是 "ScenarioId": 10,这不是请求参数的问题。我已经在提琴手中测试了 POST 场景,它运行良好。有些应用程序无法正常工作。 您是否也通过配置来配置 CORS?如果不是,您应该删除它。除此之外,您的 Web API 看起来像。问题应该出在您的防火墙上。 我发布的那个 web.config 部分应该足够了。

以上是关于AngularJS $http.POST 方法 405 错误的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 4 AngularJS 1.3 HTTP POST 具有空 CSRF 令牌或标头

angularJS通过post方法下载excel文件

AngularJS $http 之 POST 传参

使用angularjs的$http.post异步提交数据时,服务器接收不了的问题

angularjs使用$http post上传文件的时候,怎样获取文件上传的进度

AngularJS HTTP POST 未找到预期的 CSRF 令牌