2012-01-20 14 views
9

Po stronie internetowej mam dwa pola: nazwę i dokument. Dokument to pole pliku, a nazwa jest tym, co użytkownik chce wywołać w aplikacji.Jak mogę przesłać plik do aplikacji Ruby on rails przy użyciu CLI z curl?

Oto co próbowałem:

curl -F "media[document][email protected]" -F "media[name]=api" "http://example.com/medias/create.xml?api_key=123" 

ale dostaję błąd InvalidAuthenticityToken. Ten błąd występuje tylko wtedy, gdy próbuję przesłać plik/utworzyć obiekt multimedialny. Inne polecenia interfejsu API/xml działają (te, które nie dotyczą plików).

jaki jest prawidłowy sposób przesłania pliku przy użyciu cURL?

EDIT: dodanie -H "Content-Type: application/xml" do powyższego polecenia curl zrobić serwer generuje ten błąd:

/!\ FAILSAFE /!\ Tue Jan 24 08:45:03 -0500 2012 
    Status: 500 Internal Server Error 
    #<REXML::ParseException: malformed XML: missing tag start 
Line: 
Position: 
Last 80 unconsumed characters: 
<:??OH?ɽ?H? ???g??yx~t????op?.$?????P&W ??"? 

zwykle XML jest dostarczany za pomocą -d argument. ale nie sądzę, że pliki mogą być zawarte w xml? może mogą? idk.

Odpowiedz

9

Jeśli chcesz utworzyć plik z xml, powinieneś sformatować swój xml, aby użyć data, albo Base64 i/lub CDATA, w zależności od potrzeb. Gdy już masz odpowiednio sformatowany plik xml, wystarczy wysłać go z curl.

Jeśli chcesz tylko przesłać plik, nie musisz używać interfejsu xml. można po prostu zadzwonić:

curl -F "media[document][email protected]/a.png;type=image/png" -F "media[name]=api" "http://example.com/medias/ 

Dla Twojego problemu uwierzytelniania, jeśli jeszcze go na tym adresem (nie spotkać go na nowych szyn 3.2.1 świeże APP), można uzyskać do niego dostęp za pomocą zwykłej przeglądarki , pobierz informacje o ciasteczkach i wyślij je z curl. Oznacza to, że można dodać do polecenia:

--cookie "csrf-param=authenticity_token" --cookie "csrf-value=XXXXXXX" 

Albo użyć convenient script wysłać wszystkie swoje obecne cookie Firefox z hosta do zawinięcia.

2

Musisz wyłączyć token autentyczności dla akcji. Użyj tego w kontrolerze (jestem zakładając działanie nazywa create):

protect_from_forgery :except => [:create] 

Dzieje się tak tylko z POST, PUT lub DELETE żądań, to pewnie dlatego inne żądania są udane.

Jeśli jest to interfejs API, należy go całkowicie wyłączyć. Możesz usunąć protect_from_forgery w tobie ApplicationController.

Token autentyczności służy do (nieco) zapewnienia, że ​​użytkownik przejdzie przez formularz podczas modyfikowania zasobów. Aplikacja tworzy losowy token powiązany z sesją użytkownika i umieszcza go w ukrytym polu formularza. Po przesłaniu formularza token jest porównywany z tokenem przechowywanym w sesji, aby dokonać kontroli. To nie ma sensu w API.

+0

to aplikacja internetowa i interfejs API. większość innych działań, które wykorzystują pracę POST. ale z plikiem jest coś dziwnego. Nie powinienem był wyłączyć pretretu z fałszerstwa, jeśli mam klucz API, prawda? – NullVoxPopuli

+0

Cóż, to zależy od tego, w jaki sposób jest implementowany mechanizm api_key, brzmi, ponieważ nie jest to coś, co domyślnie zapewnia szyn. – aromero

+0

racja, używa restful_auth. http://www.justinbritten.com/work/2009/05/rails-api-authentication-using-restful-authentication/ – NullVoxPopuli

3

Szyny używają authenticity token, aby zapobiec CSRF. Wstawia specjalny token obliczony na podstawie sesji bieżącego użytkownika do każdego formularza i sprawdza go, gdy żądanie przychodzi na serwer.

Podczas wykonywania żądania POST za pomocą loków pojawia się ten błąd, ponieważ nie przekazujesz na serwer ważnego tokenu uwierzytelniania. Można też wyłączyć tę ochronę dla ciebie metody jak ta (uwaga, że ​​wyłączenie to będzie to działanie narażone na CSRF):

protect_from_forgery :except => :some_action 

czy można korzystać z niektórych ninjamagic zdać ważny znak autentyczności serwera.

Inna opcja polega na tym, że Rails sprawdza token autentyczności tylko dla żądań z pewnymi typami treści. Jeśli jest to API i dostajesz odpowiedź w JSON można spróbować ustawić typ zawartości wniosku o application/json tak:

curl -H "Content-Type: application/json" ... 

zobacz te linki, aby uzyskać więcej informacji: one, two, three.

+0

ale używam klucza API ... nie powinienem obsługiwać uwierzytelnienia dla mnie? – NullVoxPopuli

+0

to nie działa z tagiem -F w CURL. czy możesz podać poprawną składnię, aby przesłać plik z typem zawartości json lub xml? – NullVoxPopuli

Powiązane problemy