2010-12-05 15 views
14

Aşağıdaki sorun var. Bir web servisi, uygulamam için bir JSON POST isteği gönderiyor ve bunu ayrıştırmak istiyorum. Rails'de gelen POST isteğinin json'u nasıl ayrıştırılır?

Ben sadece

@var = params[:name_of_the_JSON_fields] 

ile params'ı erişebilir düşündük ama çalışmıyor. Benim Heroku günlüklerinde görüyorum, istek yapıldı ve parametreler var, ama onları saklayamıyorum.

Herkesin bir fikri var mı?

cevap

21

JSON (veya XML) yayınladığınızda, raylar sizin için tüm ayrıştırma işlemlerini gerçekleştirir, ancak doğru üstbilgileri eklemeniz gerekir.

Content-type: application/json 

Ve tüm serin olacak:

uygulama içermektedir var. Eğer parametreler karma JSON alıyorsanız

+0

Üzgünüm, anlamıyorum. Biraz daha açık olabilir misin? JSON göndermek istemiyorum. Bir web hizmeti, uygulamanıza bir POST isteğiyle erişiyor ve yalnızca bu isteğin verilerini almak ve sonra onu ayrıştırmak istiyorum. – thomas8877

+0

@ thomas8877 web hizmeti doğru içerik türünü kullanmadığından ayrıştırılmıyor. Eğer "application/json" u kullanamazsanız, başka bir içerik türünü json olarak ilişkilendirmelisiniz, böylece Rails bunu ayrıştırması gerektiğini anlayacaktır. –

+0

teşekkürler çocuklar! Bu web servisi ile ilgili daha fazla şey öğrenmem gerekiyor, çünkü şu anda sadece çok karmaşık. – thomas8877

9

kendiniz dönüştürebilirsiniz: Muhtemelen

@var = JSON.parse(params[:name_of_the_JSON_fields]) 
4

size yardımcı olmak için çok geç, ama belki de gelecek insanlar burada :) Belki için json ayrıştırmak gerekiyordu raylar kontrol edecek Sen, ama bu benim için hiç işe yaramadı. İstek gövdesini doğrudan okudum. 'Yajl' json ayrıştırıcısını kullanıyorum - çok hızlı. Ancak normal eski 'json' burada çalışacak çok (sadece JSON.parse kullanmak)

request.body.rewind 
body = Yajl::Parser.parse request.body.read.html_safe 
+0

Bu gerçekten iyi bir çözüm değil .. request122, kimin karakter dizisi Encoding :: BINARY olarak ayarlanmış bir StringIO döndürdüğünden. Bu yüzden, bir ascii karakteri geçmezseniz, kodlama istisnasını artıracaktır – siegy22

+0

İkili kodlama, herhangi bir karakter türünü işlemek zorunda mıdır? – Kevin

+0

Nope, ASCII-8Bit kullanacak ve utf8'e formatlamaya çalışacaktır. Neden bilmiyorum? – siegy22

7

Bu cevap tam da bu soruya belirli olmayabilir ancak AWS SNS push bildirimleri kurulumu sırasında benzer bir sorunu vardı. İlk abonelik isteğini ayrıştıramadı veya görüntüleyemedim. Umarım bu, benzer bir sorunu olan başka birine yardımcı olur.

Ben aşağıda varsayılan json ayarlı formatta, benzer basit bir API kurulum varsa ayrıştırmak gerekmez bulundu (config/routes.rb cinsinden):

namespace :api, defaults: {format: :json} do 
    namespace :v1 do 
     post "/controller_name" => 'controller_name#create' 
     get "/controller_name" => 'controller_name#index' 
    end 
    end 

önemli şey Gelen posta talebi geldiğine göre request değişkenine erişilebildiğini keşfettim. Bunu okunabilir JSON biçimine dönüştürmek için aşağıdakileri çağırabilirsiniz:

request.body.read()