Je fais une preuve de concept ici et j'ai un peu plus de problèmes que je ne le pensais. Voici ce que je veux faire et comment je le fais actuellement.Comment puis-je analyser json et écrire ces données dans une base de données en utilisant Sinatra et DataMapper
J'envoie à mon application Sinatra un fichier json contenant le message simple ci-dessous.
[
{
title: "A greeting!",
message: "Hello from the Chairman of the Board"
}
]
De là, j'ai un poste que je me sers de prendre les params et les écrire à la base de données SQLite
post '/note' do
data = JSON.parse(params) #<---EDIT - added, now gives error.
@note = Note.new :title => params[:title],
:message => params[:message],
:timestamp => (params[:timestamp] || Time.now)
@note.save
end
Lorsque j'envoie le message que l'horodatage et l'identifiant sont enregistrés dans la base de données mais le titre et le message sont nuls.
Qu'est-ce qui me manque?
Merci
Edit:
Maintenant, quand je lance mon application et de l'envoyer le fichier JSON je reçois cette erreur:
C:/Users/Norm/ruby / Ruby192/lib/ruby /1.9.1/webrick/server.rb:183:in `bloc dans start_thread ' TypeError: impossible de convertir le hachage en chaîne
Édition 2: un certain succès.
J'ai le json ci-dessus dans un appel de fichier test.json qui est la façon dont le json sera posté. Pour afficher le fichier je HTTPClient:
require 'httpclient'
HTTPClient.post 'http://localhost:4567/note', [ :file => File.new('.\test.json') ]
Après y avoir réfléchi un peu plus, je pensais que le fichier était affichait le problème donc j'essayé de l'envoyer d'une manière différente. L'exemple ci-dessous a travaillé une fois que je change ma n poignée poste/note à ceci:
data = JSON.parse(request.body.read)
Mon nouveau send.rb
require 'net/http'
require 'rubygems'
require 'json'
@host = 'localhost'
@port = '4567'
@post_ws = "/note"
@payload ={
"title" => "A greeting from...",
"message" => "... Sinatra!"
}.to_json
def post
req = Net::HTTP::Post.new(@post_ws, initheader = {'Content-Type' =>'application/json'})
#req.basic_auth @user, @pass
req.body = @payload
response = Net::HTTP.new(@host, @port).start {|http| http.request(req) }
puts "Response #{response.code} #{response.message}:
#{response.body}"
end
thepost = post
puts thepost
Je me rapproche. Merci pour toute l'aide jusqu'ici.
Greg merci pour votre explication de hashes et json.Très utile. – Norm
Si 'params' est le flux de données JSON qui fonctionnera correctement. –
Arrgggg. Je reçois une erreur "Impossible de convertir Has en String" "Je vais déjeuner – Norm