Nor*_*orm 3 ruby json datamapper sinatra
我在这里做了一个概念验证的事情,并且遇到了比我想象的更多的麻烦.这是我想要做的以及我目前是如何做的.
我发送我的Sinatra应用程序一个json文件,其中包含下面的简单消息.
[
{
title: "A greeting!",
message: "Hello from the Chairman of the Board"
}
]
Run Code Online (Sandbox Code Playgroud)
从那里我有一个帖子,我用它来获取参数并将它们写入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
Run Code Online (Sandbox Code Playgroud)
当我发送消息时,时间戳和id被保存到数据库,但标题和消息是零.
我错过了什么?
谢谢
编辑:
现在,当我运行我的应用程序并将其发送给json文件时,我收到此错误:
C:/Users/Norm/ruby/Ruby192/lib/ruby/1.9.1/webrick/server.rb:183:在'block in start_thread'中TypeError:无法将Hash转换为String
编辑2:取得了一些成功.
我在文件调用test.json中有上面的json,这是json的发布方式.为了发布我使用HTTPClient的文件:
require 'httpclient'
HTTPClient.post 'http://localhost:4567/note', [ :file => File.new('.\test.json') ]
Run Code Online (Sandbox Code Playgroud)
在考虑了一些之后,我认为发布文件是问题所以我尝试以不同的方式发送它.下面的示例一旦我将我的帖子/注释句柄更改为:
data = JSON.parse(request.body.read)
Run Code Online (Sandbox Code Playgroud)
我的新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
Run Code Online (Sandbox Code Playgroud)
所以我越来越近了.感谢目前为止所有的帮助.
Sinatra不会自动为您解析JSON,但幸运的是,解析JSON非常简单:
首先要求它.require 'rubygems'如果你不在Ruby 1.9+上:
>> require 'json' #=> true
>> a_hash = {'a' => 1, 'b' => [0, 1]} #=> {"a"=>1, "b"=>[0, 1]}
>> a_hash.to_json #=> "{"a":1,"b":[0,1]}"
>> JSON.parse(a_hash.to_json) #=> {"a"=>1, "b"=>[0, 1]}
Run Code Online (Sandbox Code Playgroud)
这是用于创建的往返用法,然后解析一些JSON.IRB输出显示散列和嵌入式数组转换为JSON,然后解析回散列.你应该能够为了你的邪恶需求而打破这种局面.
为了获得这些字段,我们将更多地分解上面的示例并假装我们已经从连接的远程端接收到JSON.因此,received_json下面是传入的数据流.将它传递给JSON解析器,你将获得一个Ruby数据哈希.像往常一样访问哈希值并获得值:
>> received_json = a_hash.to_json #=> "{"a":1,"b":[0,1]}"
>> received_hash = JSON.parse(received_json) #=> {"a"=>1, "b"=>[0, 1]}
>> received_hash['a'] #=> 1
>> received_hash['b'] #=> [0, 1]
Run Code Online (Sandbox Code Playgroud)
传入的JSON可能是params[]哈希中的一个参数,但我不确定它将隐藏在哪个键下,所以你需要弄明白.它可能被调用'json','data'但那是特定于应用程序的.
您的数据库代码看起来没问题,如果您看到一些数据写入其中,则必须正常工作.看起来你只需要从JSON中检索字段.
| 归档时间: |
|
| 查看次数: |
15087 次 |
| 最近记录: |