Dużo czytam o błędzie „Access-Control-Allow-Origin”, ale nie rozumiem, co mam naprawić :(
Gram z Google Moderator API, ale kiedy próbuję dodać nową serię , otrzymuję:
XMLHttpRequest cannot load
https://www.googleapis.com/moderator/v1/series?key=[key]
&data%5Bdescription%5D=Share+and+rank+tips+for+eating+healthily+on+the+cheaps!
&data%5Bname%5D=Eating+Healthy+%26+Cheap
&data%5BvideoSubmissionAllowed%5D=false.
Origin [my_domain] is not allowed by Access-Control-Allow-Origin.
Próbowałem z parametrem callback i bez niego, próbowałem dodać „Access-Control-Allow-Origin *” do nagłówka. I nie wiem, jak tutaj używać $ .getJSON, jeśli się aplikuję, ponieważ muszę dodać nagłówek Authorization i nie wiem, jak to zrobić bez wcześniejszego połączenia z $ .ajax: /
Jakieś światło dla tej ciemności uu?
To jest kod:
<script src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
var scope = "https://www.googleapis.com/auth/moderator";
var token = '';
function create(){
if (token == '')
token = doCheck();
var myData = {
"data": {
"description": "Share and rank tips for eating healthily on the cheaps!",
"name": "Eating Healthy & Cheap",
"videoSubmissionAllowed": false
}
};
$.ajax({
url: 'https://www.googleapis.com/moderator/v1/series?key='+key,
type: 'POST',
callback: '?',
data: myData,
datatype: 'application/json',
success: function() { alert("Success"); },
error: function() { alert('Failed!'); },
beforeSend: setHeader
});
}
function setHeader(xhr) {
xhr.setRequestHeader('Authorization', token);
}
function doLogin(){
if (token == ''){
token = google.accounts.user.login(scope);
}else{
alert('already logged');
}
}
function doCheck(){
token = google.accounts.user.checkLogin(scope);
return token;
}
</script>
...
...
<div data-role="content">
<input type="button" value="Login" onclick="doLogin();">
<input type="button" value="Get data" onclick="getModerator();">
<input type="button" value="Create" onclick="create();">
</div><!-- /content -->
Odpowiedzi:
Rozwiązałem błąd Access-Control-Allow-Origin modyfikując parametr dataType na dataType: 'jsonp' i dodając crossDomain: true
źródło
crossDomain:true
jest to wymagane. Rozumiem, że jest to konieczne tylko wtedy, gdy wykonujesz żądanie we własnej domenie, ale chcesz, aby jQuery traktował je jak żądanie międzydomenowe.crossDomain
nie jest potrzebne. jest to zwykłejsonp
żądanie przeznaczone do komunikacji między domenami.Miałem dokładnie ten sam problem i nie był to problem międzydomenowy, ale ta sama domena. Właśnie dodałem tę linię do pliku php, który obsługiwał żądanie ajax.
Zadziałało jak urok. Dzięki plakatowi
źródło
Jeśli masz ten błąd podczas próby wykorzystania usługi, której nie możesz dodać nagłówka
Access-Control-Allow-Origin *
w tej aplikacji, ale możesz umieścić przed serwerem odwrotne proxy, błędu można uniknąć, przepisując nagłówek.Zakładając, że aplikacja działa na porcie 8080 (domena publiczna www.mydomain.com ) i umieścisz odwrotne proxy na tym samym hoście na porcie 80, to jest konfiguracja dla zwrotnego proxy Nginx :
źródło
Access-Control-Allow-Origin: http://example.com
.Tak, w momencie, gdy jQuery widzi, że adres URL należy do innej domeny, zakłada, że połączenie to jest połączeniem międzydomenowym, dlatego
crossdomain:true
nie jest tutaj wymagane.Należy również pamiętać, że nie można wykonać połączenia synchronicznego z,
$.ajax
jeśli adres URL należy do innej domeny (między domenami) lub jeśli używasz formatu JSONP. Dozwolone są tylko połączenia asynchroniczne.Uwaga: możesz zadzwonić do usługi synchronicznie, jeśli określisz to
async:false
w swoim żądaniu.źródło
W moim przypadku problem powoduje nazwa domeny podrzędnej. Oto szczegóły
Użyłem
app_development.something.com
, tutaj_
subdomena podkreślenia ( ) tworzy błąd CORS. Po zmianieapp_development
naapp-development
to działa dobrze.źródło
Jest mały hack z php. Działa nie tylko z Google, ale z każdą witryną, której nie kontrolujesz i której nie możesz dodać Access-Control-Allow-Origin *
Musimy stworzyć plik PHP (np. GetContentFromUrl.php ) na naszym serwerze WWW i zrobić małą sztuczkę.
PHP
JS
Jak to działa:
I możemy tworzyć zdarzenia po kliknięciu, umieścić to zdarzenie na jakimś przycisku. Mam nadzieję, że to pomoże!
źródło