/ / Połączenie w celu uzyskania danych - ruby-on-rails, ruby, api

Połączenie w celu uzyskania danych - ruby-on-rail, ruby, API

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 № 1

To, 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,