【问题标题】:Returning JSON to client get request in ruby在ruby中将JSON返回给客户端获取请求
【发布时间】:2011-07-06 17:06:04
【问题描述】:

我正在尝试制作一个完整的 ruby​​ 服务。我的程序分解方式是 2 个应用程序。一个是网络服务蜘蛛,另一个是网络应用程序(尚未开发)。网络应用程序将使用 get post 和通常的东西向爬虫发出请求。

这是一个使用 curl 的示例发布请求\

curl -d 'url=www.whatever.com&depth=10' http://127.0.0.1:8080/requests/new

工作正常,似乎发布了一个请求。

这里是删除

curl -x DELETE http://127.0.0.1:8080/requests/1      where 1 is id of request.

我的问题是如何做到这一点,以便如果有人提出请求(即我的网络应用程序),我可以让蜘蛛以 JSON 响应

我假设我需要将@request 变量格式化为 JSON,然后让它成为响应,但我不知道如何去做。

另外附注:curl get 请求是否以相同方式建模。

另一方面:有没有办法在堆栈溢出中标记代码而不是使用四个空格。

【问题讨论】:

  • 您可以突出显示您的代码,然后单击“{}”代码按钮,它会为您缩进 4 个空格。

标签: ruby-on-rails ruby web-services json


【解决方案1】:

如果无论请求来自何处(浏览器或蜘蛛),您都希望返回 JSON, 然后只需从您的控制器返回 json 数据:

render :json => @object

如果您想支持爬虫 (JSON) 和来自浏览器 (HTML) 的传统 Web 请求, 使用普通的 respond_to(使用 Rails 2 示例..我还不知道 Rails 3):

respond_to do |format|
  format.js { render :json => @object }
  format.html
end

并确保视图文件位于 html 的正确位置。

【讨论】:

  • format.json { render :json => @object } 您可以选择使用:only:except 来限制响应。
  • 这只适用于 Rails 控制器,不适用于纯 Ruby。
【解决方案2】:

您可以像这样在 Json 中发送参数:

curl -d "{ url: \"www.whatever.com\", depth: \"10\"}" -H "Content-Type: application/json" -H "Accept: application/json" http://127.0.0.1:8080/requests/new

对于响应,您必须使用 Rails 3 中的 respond_to 或 respond_with 将控制器定义为 Json 格式的响应

【讨论】:

  • 除了respond_to和respond_with ...你可以强制json作为响应:“render :json=>@models”
  • 我认为 get 没有参数。我虽然你只会在 /requests/2 或 /3 或其他任何东西之后指定 id
  • @overtone 我不明白!如果你只是在 json 中调用一个资源,你可以这样做: curl-H "Content-Type: application/json" -H "Accept: application/json" 127.0.0.1:8080/wahtever/id.json
  • @乔尔·阿泽马尔。你不明白什么?如果你的意思是我的最后一条评论。那么我认为除了 url 之外,在 get 请求中指定他们想要的内容不是由客户或用户决定的。所以基本上他们说 GET www.whatever.com/something 该页面必须指定响应类型。但是你在这里告诉我的是他们指定了返回类型。例如“content-type:application-json”我不知道你能做到这一点,这是我试图做的唯一一点。
【解决方案3】:

嗯,响应通常以纯 HTML 格式输出。

因此,您要做的就是编写一个视图,该视图仅获取响应数据并格式化为 JSON。

JSON 格式非常简单。所以,如果我的 GET 响应是一个包含两个名称的列表,例如,name = 'joe'name = 'bob'

JSON 将是: `{ "name":"joe","name":"bob" }

... 并且视图代码看起来像(伪代码):

{
<% @names.each do |name| %>
  "name":"<%=h name %>",
<% end %>
}

【讨论】:

  • 不要那样做...有 Object#to_json。无论如何,一个具有重复键的对象?
  • 哦,是的,我完全忘记了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
相关资源
最近更新 更多