AngularJS中的$http POST调用返回HTTP状态码405。

5

我试图从一个JavaScript客户端向Foursquare API的addvenue接口发起POST请求。这是API终端文档链接
但服务器返回了405 - 方法不允许。这里是发起调用的片段。

var postdata = {'oauth_token':$scope.access_token_foursquare,
                        'v':'20141217','name':'randomlisting',
                        'll':'44.3,37.2','m':'foursquare'};
var req = {
            method: 'POST',
            url: 'https://api.foursquare.com/v2/venues/add',
            headers: {
              'content-type': 'application/x-www-form-urlencoded'
            },
            data: postdata
          }

$http(req).then(function(response){
      console.log(response);
           });

以下是上述调用的请求和响应数据包。
Remote Address:103.245.222.185:443
Request URL:https://api.foursquare.com/v2/venues/add
Request Method:OPTIONS
Status Code:405 Method Not Allowed

**Request Headers**
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:accept, authorization, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:api.foursquare.com
Origin:http://localhost:9000
Referer:http://localhost:9000/foursquare
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36

**Response Headers**

Accept-Ranges:bytes
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Length:90
Content-Type:application/json; charset=utf-8
Date:Wed, 17 Dec 2014 12:15:15 GMT
Keep-Alive:timeout=10, max=50
Server:nginx
Tracer-Time:1
Via:1.1 varnish
X-Cache:MISS
X-Cache-Hits:0
X-Served-By:cache-sn87-SIN

我还学习了CORS问题。在我的情况中,服务器允许所有来源,正如响应头中所看到的那样。我被这个问题困扰了,无法继续进行。
任何帮助将不胜感激。 提前致谢。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Rasalom
感谢您的迅速回复。我按照您提供的链接中的指示尝试了以下操作。 angular.module('yourModuleHere') .config(function ($httpProvider) { delete $httpProvider.defaults.headers.common['X-Requested-With']; }); 但问题仍然存在。 - bala
你找到解决方案了吗?请分享。 - MohQut
1个回答

1

请求方法: OPTIONS

客户端向服务器发出预检 OPTIONS 请求。

在进行非简单(例如不是 GET)的跨域(CORS)请求前,浏览器会自动发送 OPTIONS 请求。

OPTIONS 请求的目的是与服务器进行快速检查,以确保客户端有权限在实际进行 POST 请求之前进行 POST。因此,客户端会进行1或2个请求。

首先进行 OPTIONS 请求,如果 OPTIONS 请求响应成功(不是 405),则进行 POST 请求。

OPTIONS 请求失败的原因很可能是您的服务器响应中未说明您的服务器支持 OPTIONS 请求。

请将以下标头添加到您的服务器响应中..

Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS

那么它应该都能正常工作。

查看https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests获取更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接