我在这里做了一个概念证明,比我想象的要麻烦一点。这是我想要做的以及我目前是如何做的。
我发送的Sinatra应用程序是一个json文件,其中包含以下简单信息。
[
{
title: "A greeting!",
message: "Hello from the Chairman of the Board"
}
]
从那里我有一个帖子,我用它来获取参数并将它们写入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
当我发送消息时,时间戳和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') ]
在考虑了一些之后,我认为发布文件是问题所以我尝试以不同的方式发送它。一旦我将我的帖子/注释句柄更改为此,下面的示例就起作用了:
data = JSON.parse(request.body.read)
我的新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
所以我越来越近了。感谢目前为止的所有帮助。
答案 0 :(得分:6)
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]}
这是用于创建的往返用法,然后解析一些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]
传入的JSON可能是params[]
哈希中的一个参数,但我不确定它隐藏在哪个键下,所以你需要弄明白。它可能被称为'json'
或'data'
,但这是应用特定的。
您的数据库代码看起来没问题,如果您看到一些数据写入其中,则必须正常工作。看起来你只需要从JSON中检索字段。