W moim projekcie muszę zintegrować bibliotekę i przeanalizować pliki prezentowane w formacie csv. Aby uzyskać dostęp do biblioteki i uzyskać informacje z tego pliku, używam $ajax w następujący sposób:
<script>
$(document).ready(function(){
$.ajax({
type: "GET",
url: "http://stats.xxx.tv/osexternal/reports/xxxxx/xxx_2014_YTD/2014-03-12.csv",
contentType: "application/json",
dataType: "json",
username: "xxxx@xxxx.com",
password: "dT$xxxx%949",
success: function (){
console.log("success");
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
}
});
});
<script>
Czy ktoś może dać mi znać, co jest nie tak z tym podejściem, ponieważ mam problem z wieloma domenami. I proszę, daj mi znać wszelkie alternatywy za pomocą klejnotów. Z góry dziękujemy za pomoc!
Odpowiedzi:
1 dla odpowiedzi № 1To, na co się natkniesz, wydaje się być jakimś rodzajem problemu z CORs. Ważne informacje na temat problemów z CORs:
- Jest to polityka bezpieczeństwa dla Javascript, więc dotyczy tylko połączeń przychodzących/z JS.
- Możliwość uzyskania do niego dostępu z przeglądarki „bezpośrednio” nie ma nic wspólnego z CORami
- CORS potrafi być naprawdę irytujący
Teraz, jak go rozwiązać, możesz spróbować dodać:
with_credentials: true
do argumentów Ajax, ale mam przeczucie, że będzie to coś dziwniejszego niż to... także, ponieważ musisz dołączyć Nazwa Użytkownika i hasło chyba lepiej nie ujawniać ich na kliencie, aby ktokolwiek miał...
Więc to, co zrobię, to wywołanie na serwerze (przykład dotyczy akcji kontrolera rails, ale metoda może być używana w aplikacji Sinatra tak samo), a następnie zwrócę plik CSV do przeglądarki:
require "net/http"
class MyController < ActionController::Base
# ...
def get_csv
uri = URI("http://stats.adap.tv/osexternal/reports/xxxxx/xxx_2014_YTD/2014-03-12.csv")
csv_request = Net::HTTP::Get.new(uri)
csv_request.basic_auth("username", "password")
csv_data = csv_request.request.body
csv
end
end
Zakładam, że używasz Rubiego z powodu twojego odniesienia do „klejnotów”. temu dokumentacja dla Net::HTTP
http://ruby-doc.org/stdlib-2.1.1/libdoc/net/http/rdoc/Net/HTTP.html
i nieco łatwiejsza do strawienia wersja:
http://www.rubyinside.com/nethttp-cheat-sheet-2940.html
Ogólnie rzecz biorąc, zawsze będzie łatwiej (i bezpieczniej)niech twój serwer wyśle żądanie do zewnętrznego hosta (jest to szerokie uogólnienie i istnieją absolutnie przypadki, w których nie jest to to, czego chcesz).Jeśli potrzebujesz wykonać żądanie między domenami, sugeruję zacząć od:
http://www.html5rocks.com/en/tutorials/cors/
Prawdopodobnie da ci kilka dobrych wskazówek, aby dowiedzieć się, dlaczego obecnie nie działa.
Najlepiej,