2011-07-20 13 views
16

Próbuję uwierzytelnić się w interfejsie API, który zezwala tylko na uwierzytelnianie za pomocą POST z JSON jako danymi formularza, w formacie {"nazwa użytkownika": "nazwaużytkownika", "hasło": "moje hasło"}.jQuery między domenami POST shenanigans

Próbowałem przez dwa dni pracować z jQuery, ale mam problemy, ponieważ jest to domena krzyżowa. Jak mogę to zrobić?

Komunikat o błędzie:

Request Method:OPTIONS 
Status Code:405 METHOD NOT ALLOWED 

kod do tej pory:

var username = "myusername"; 
var password = "mypass" 
var authurl = "https://myurl"; 

$.ajax 
({ 
    type: "POST", 
    url: authurl, 
    dataType: 'json', 
    contentType: "application/json; charset=utf-8", 
    async: false, 
    data: {'json':'{"username":"' + username + '", "password":"' + password + '"}'}, 
    success: function (result) { 
     $('#json').html(result); 
    } 
}) 

Podsumowując:

  • API akceptuje tylko POST dla auth
  • API wymaga json jako forma danych , example: {"username": "myusername", "password": "mojehasło"}
  • JS jest prowadzony z innej domeny, powoduje błędy domenach

Twoja pomoc jest mile widziane :)

+0

Czy masz dostęp do czy jest to jakiś predefiniowany interfejs API, którego nie można zmodyfikować? – zatatatata

Odpowiedz

15

Należy przestrzegać inny wzór. Twój lokalny JS wykona wpis ajaxowy na lokalny URL, który zaakceptuje metodę POST z danymi json.

W tym momencie twój kod serwera wykona HTTP POST z odpowiednimi danymi do zdalnego serwera, otrzyma odpowiedź i odeśle ją do wywołującego js.

+0

Dzięki Matteo, naprawiłem to poprzez przepisanie ścieżki do innego serwera, który działał :) – FLX

+0

Pracowałem bezbłędnie, to rozwiązanie jest najlepsze w porównaniu do YQL i JSONP ...Ponieważ Twój serwer jest pod Twoją kontrolą, możesz łatwo dodać program Access-Control-Allow-Origin do swojego serwera. Dzięki Matteo –

+0

Nie ma za co :) –

4

Problem polega na tym, że domena próbujesz pocztą na nie odpowiedzieć na żądanie opcji, które są wysyłane przed każdym krzyżem żądanie -domeny. Za pomocą żądania OPTIONS przeglądarka otrzymuje informacje o regułach cross-domain itp. Aby włączyć żądanie cross-domain, serwer musi ustawić Access-Control-Allow-Origin:* (lub domenę skryptu, faktycznie, ale * obejmuje wszystko) i może być nagłówkami Access-Control-Allow-Methods: GET, POST, OPTIONS.

2

Mam wspólny hosting na GoDaddy. Potrzebowałem też odpowiedzi na to pytanie, a po przeszukiwaniu okazało się, że jest to możliwe.

Napisałem plik .htaccess, umieść go w tym samym folderze co moją stronę akcji. Oto zawartość pliku .htaccess:

Header add Access-Control-Allow-Origin "*" 
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type" 
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" 

tutaj jest moje wezwanie ajax:

$.ajax({ 
     url: 'http://www.mydomain.com/myactionpagefolder/gbactionpage.php', //server script to process data 
     type: 'POST', 
     xhr: function() { // custom xhr 
      myXhr = $.ajaxSettings.xhr(); 
      if(myXhr.upload){ // check if upload property exists 
       myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload 
      } 
      return myXhr; 
     }, 
     //Ajax events 
     beforeSend: beforeSendHandler, 
     success: completeHandler, 
     error: errorHandler, 
     // Form data 
     data: formData, 
     //Options to tell JQuery not to process data or worry about content-type 
     cache: false, 
     contentType: false, 
     processData: false 
    }); 

Zobacz ten artykuł dla odniesienia:

Header set Access-Control-Allow-Origin in .htaccess doesn't work

+0

co, jeśli to żądanie jQuery jest wysyłane z jakiejś aplikacji, takiej jak aplikacja dla systemu Android z webviewem wykonującym jQuery. dodajesz. Htaccess u klienta (nadawcy) lub po stronie serwera (odbiorcy)? –

+1

Dodałbyś serwer .htaccess po stronie serwera – pimbrouwers

Powiązane problemy