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=""
不好:
<form ng-submit="doSubmit()" name="myform" method="post" action="" role="form">
好:
<form ng-submit="doSubmit()" name="myform" role="form">
【讨论】:
【参考方案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>
如果您计划支持 PUT
和 DELETE
动词,您还需要处理 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的$http.post异步提交数据时,服务器接收不了的问题