2012-01-20 16 views
9

Nesnelerin web tarafında iki alanım var: ad ve belge. Belge bir dosya alanıdır ve ad, kullanıcının uygulamada dosyayı çağırmak istediği addır. İşteCurl CLI kullanarak raylar uygulamasında rubiuma bir dosyayı nasıl yükleyebilirim?

denedim budur:

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

ancak bir InvalidAuthenticityToken Hatası olsun. Bu hata, yalnızca bir dosya yüklemeye/medya nesnesi oluşturmaya çalıştığımda oluşur. Diğer API/xml komutları (dosyaları içermeyenler)

Bir dosyayı cURL kullanarak yüklemek için doğru yol nedir?

DÜZENLEME: -H "Content-Type: application/xml" ekleyerek yukarıdaki bukle komutuna sunucu bu hata yapmak:

/!\ 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 ??"? 

normalde XML -d argümanı kullanarak sağlanır. ama sanırım dosyalar xml'ye eklenemez mi? belki yapabilirler? Bilmiyorum.

cevap

9

xml dosyasından dosya oluşturmak isterseniz, gereksinimlerinize bağlı olarak data, Base64 ve/veya CDATA'u kullanmak için xml formatını biçimlendirmeniz gerekir. Corretly formatlı bir xml dosyanız olduğunda, sadece curl ile göndermek zorundasınız.

Sadece dosya yüklemek istiyorsanız, bir xml arabirimi kullanmanız gerekmez. Sadece çağırabilirsiniz:

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

sizin doğrulama sorunu için, yine bu url üzerinde varsa (ben yeni raylar 3.2.1 taze uygulaması üzerine karşılaşmak yoktur), normal bir tarayıcı ile erişebilirsiniz , çerez bilgilerini alın ve curl ile gönderin.

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

Ya kıvrılma içine ana bilgisayardan tüm geçerli Firefox çerezleri göndermek için bir convenient script kullanın: Bu sizin komuta katacak anlamına gelir.

2

Eylem için özgünlük belirtecini devre dışı bırakmanız gerekir. controller içerisinde bunu kullanın (ben eylem create adlı varsayarak): Bu sadece POST ile olur

protect_from_forgery :except => [:create] 

, diğer isteği başarılı olmasının nedeni büyük olasılıkla budur, PUT veya istekleri DELETE.

Bu bir API ise, bunu tamamen devre dışı bırakmak isteyeceksiniz. 'u ApplicationController'dan kaldırabilirsiniz.

Özgünlük belirteci, (bir şekilde) kullanıcının, kaynakları değiştirirken formdan geçmesini sağlamak için kullanılır. Uygulama, kullanıcı oturumuyla ilişkili bir rastgele belirteç oluşturur ve bu formu gizli bir alana yerleştirir. Form sunulduğunda, jeton, oturumu kontrol etmek için oturumda saklanan ile karşılaştırılır. Bu, bir API’da herhangi bir anlam ifade etmeyecektir.

+0

Bir web uygulaması ve bir API'sıdır. POST kullanan diğer eylemlerin çoğu çalışır. ama dosyada garip bir şey var. Bir api anahtarım varsa sahtekârlıktan pretect'i devre dışı bırakmamalıyım, değil mi? – NullVoxPopuli

+0

Bu, api_key mekanizmasının nasıl uygulandığına bağlı olarak, rayların varsayılan olarak sağladığı bir şey olmadığı için ses çıkarır. – aromero

+0

doğru, restful_auth kullanıyor. http://www.justinbritten.com/work/2009/05/rails-api-authentication-using-restful-authentication/ – NullVoxPopuli

3

Raylar, CSRF ürününü önlemek için authenticity token kullanır. Mevcut kullanıcının oturumuna göre hesaplanan özel jetonu her forma ekler ve sunucuya istek geldiğinde onu kontrol eder.

Curl kullanarak POST isteğini gerçekleştirdiğinizde, sunucuya geçerli bir kimlik doğrulama jetonu geçmediğinizde bu hatayı alırsınız.

protect_from_forgery :except => :some_action 

veya sunucuya geçerli özgünlük belirteci geçmek için bazı ninjamagic kullanabilirsiniz: Sen (devre dışı bırakmanız CSRF'e için bu eylem savunmasız yapacak, not) böyle size yöntemi için bu korumayı devre dışı bırakabilir ya.

Başka bir seçenek, Rails'in özgünlük belirtecini yalnızca belirli içerik türlerine sahip istekler için denetlemesi gerçeğine dayanır. o bir API ve sen JSON yanıtını alıyorsanız böyle application/json talebin içeriğinin türünü ayarlama deneyebilirsiniz:

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

fazla bilgi için bu bağlantıları bakınız: one, two, three.

+0

ama bir API anahtarı kullanıyorum ... bu benim için kimlik doğrulaması yapmamalı mıyım? – NullVoxPopuli

+0

bu, CURL'deki -F etiketi ile çalışmaz. Dosyayı json veya xml içerik türüyle yüklemek için uygun sözdizimini sağlayabilir misiniz? – NullVoxPopuli

İlgili konular