2014-12-17 14 views
5

Provo a effettuare una chiamata POST da un client javascript a un'API di foursquare chiamata addvenue. Questo è l'endpoint API documentation link.
Ma il server restituisce 405 - Metodo non consentito. Ecco lo snippet che effettua la chiamata

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); 
      }); 

Di seguito è riportato il pacchetto di richiesta e risposta per la chiamata precedente.

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 

Ho studiato anche sul problema CORS. Nel mio caso il server sta permettendo tutte le origini, come si vede nelle intestazioni di risposta. Sono rimasto colpito da questo problema e non ho potuto procedere oltre.

Qualsiasi aiuto sarebbe apprezzato. Grazie in anticipo.

+0

Questo tipo di domanda si verifica tutti i giorni, forse questo sarà utile: http://stackoverflow.com/questions/19554414/angularjs-disabling-cors – Rasalom

+0

Grazie per la risposta immediata. Ho provato quanto segue come menzionato nel link che hai fornito. 'angular.module ('yourModuleHere') .config (function ($ httpProvider) { delete $ httpProvider.defaults.headers.common ['X-Requested-With']; });' Ancora lo stesso problema persiste. – bala

+0

Hai trovato la soluzione, per favore condividi – MohQut

risposta

1

metodo di richiesta: OPZIONI

Il cliente sta facendo un pre-volo OPZIONI richiesta al server.

Una richiesta OPZIONI viene eseguita automaticamente dal browser prima di eseguire una richiesta di dominio incrociato (ad esempio non GET) (CORS).

Lo scopo della richiesta OPTIONS è un controllo rapido con il server per garantire che al client sia consentito eseguire il POST prima di eseguire effettivamente il POST. Quindi il cliente fa 1 o 2 richieste.

Una richiesta OPZIONI e se la richiesta OPZIONI risponde con esito positivo (non un 405), quindi effettuare il POST.

La richiesta OPTIONS ha esito negativo molto probabilmente perché nella risposta del server non è stato specificato che il server supporta le richieste OPTIONS.

Aggiungi questa intestazione al risposta del server ..

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

allora dovrebbe lavorare tutti.

Vedi https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests per ulteriori informazioni