无法从我的GET请求中获取Sinatra中的参数URL

时间:2015-03-26 01:25:21

标签: ruby url sinatra

我有一个我试图使用的Ruby Gem,它将URL作为参数。我使用Sinatra为此服务创建Web服务。我不知道Sinatra和Ruby .. 所以,如果我做了:

  curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://localhost:4567?http://www.myhostserver.com/mattdaemon

我希望我的Ruby应用程序解析http://www.myhostserver.com/mattdaemon并将其传递给我的Ruby Gem。

这是我的代码:

require 'sinatra'
require 'rubygems'
require 'myrubygem'
require 'rack'
require 'rack/server'


get '/:id' do
#  widget = myGem::Profile.get_profile("#{env['QUERY_STRING']}")
# widget = myGem::Profile.get_profile("#{params[:id]}") 
  set :my_url, "#{request.env['QUERY_STRING']}"
widget = myGem::Profile.get_profile(":my_url]}")
  return status 404 if widget.nil?
  widget.to_json
end

注释掉了我的尝试..我总是得到404回复..我怎么会得到相关的错误信息,以了解发生了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

在这一点上有点困惑

我猜主要是你需要了解url路径与参数和查询字符串之间的区别。

假设您有name mattdaemon的参数value。下一个假设是您使用GET而不是POST。

查询字符串

这就是你现在所拥有的。查询字符串是这样的:?param=value&param2=value

代码示例

get "/" do
     puts params[:name]
end

卷曲

  

curl myhostserver.com:4567?name=mattdaemon

params为您解析查询字符串,以便您轻松访问这些值。

你在这里做的是使用查询字符串进行GET。

路线模式

Sinatra允许您像其中包含参数的URL一样构建REST。

get "/:name" do
    puts params[:name]
end

get "/user/:name" do |name|
    puts name
end

curl

  

curl myhostserver.com:4567/mattdaemon   curl myhostserver.com:4567/user/mattdaemon

正如您所看到的,params在这里也是最适合您的工作。

答案 1 :(得分:0)

好的,这:Sinatra and question mark帮助了我。 我做了:

get '/' do
  string_to_add = request.query_string
  widget = myGem::Profile.get_profile("#{string_to_add}")
  return status 404 if widget.nil?
  widget.to_json
end

拨打电话:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://myhostserver.com:4567?mattdaemon

奇怪的是我传递的网址 - 没有参数名称..如果我使用http://myhostserver.com:4567/mattdaemon(即作为资源)不起作用。在这一点上有点困惑,但是,它确实有效。