2014-07-09 24 views
9

Zauważyłem, że mój Angular tworzy żądanie OPTIONS również przed każdym żądaniem POST.AngularJS - jak wyłączyć żądanie OPTION?

Używam niestandardowej usługi interfejsu API do obsługi żądań HTTP.

app.service('ApiService', function ($http) { 

/** 
* Process remote POST request to give URL with given params 
* @param {String} url 
* @param {String} POST params 
* @return {JSON} response from server 
*/ 
this.doHttpRequest = function (type, url, params) { 
    return $http({ 
     method: type, 
     url: url, 
     data: params, 
     timeout: 5000, 
     headers: { 
      "Content-Type": "application/json", 
     } 
    }); 
} 

}); 

Pytanie brzmi:

Jak mogę go (wartości, które config umieścić gdzie) wyłączyć?

Czy opcje są przydatne? Myślę, że jest to coś w rodzaju "Handshake between 2 servers".

wersja kątowa: 1.2.15

Dzięki za wszelkie rady.

Odpowiedz

17

To nie jest kątowe. Jest to XMLHttpRequest.

Kompleksowe żądania HTTP o krzyżowym pochodzeniu wymagają a pre-flight OPTIONS request, aby przeglądarka mogła dowiedzieć się, czy inny serwer udzieli pozwolenia na żądanie Ajax.

W przypadku braku pewności, że zgłoszone zapytanie Ajax to simple, nie można zablokować żądania OPCJE.

Prosty wniosek:

  • Tylko używa GET, HEAD lub POST. Jeśli do wysyłania danych do serwera używany jest test POST, typ zawartości danych wysyłanych do serwera za pomocą żądania HTTP POST jest jednym z aplikacji/x-www-formularz-zakodowany, wieloczęściowy/formularz-danych lub tekst/zwykły .
  • Nie ustawić niestandardowe nagłówki z żądaniem HTTP (takich jak X-Modified, etc.)

Chyba że chcesz zrezygnować z wysyłania JSON, nie można użyć prostego wniosku w tej sprawie.

2

biegnę do ścisłej sytuacji, trzeba uzyskać JSON z cross-site HTTP żąda i naprawić go za pomocą jQuery prośbę, zamiast angularjs

$.getJSON('http://www.host.com/test.json', '', function (data) { 
    if (meta) { 
     console.log("jq success :" + JSON.stringify(data)); 
    } 
    console.log("jq success, but empty JSON"); 
}) 
    .done(function() { 
     console.log("jq second success"); 
    }) 
    .fail(function (data) { 
     console.log("jq fail " + JSON.stringify(data)); 
    }) 
    .always(function() { 
     console.log("jq complete"); 
    }); 

użyłem Amazon S3 CDN i OPCJE wnioski nie działały dobrze z nim, więc to mnie uratowało. Odpowiedź z serwera S3 była następująca:

Ta dystrybucja nie jest skonfigurowana do zezwalania na metodę żądania HTTP, która została użyta dla tego żądania. Dystrybucja obsługuje tylko żądania buforowane.