【问题标题】:Sinatra json rendering not working as expectedSinatra json 渲染未按预期工作
【发布时间】:2013-01-31 21:57:27
【问题描述】:

我在 Sinatra 中遇到了一个问题,我无法仅使用 json 进行响应,而且我在任何地方都找不到好的 sinatra 文档,大部分内容似乎已经过时了。

不管怎样,代码如下:

module MemcachedManager
  class App < Sinatra::Base
    register Sinatra::Contrib
    helpers Sinatra::JSON

    get '/' do
      json({ hello: 'world' })
    end
  end
end

MemcachedManager::App.run! if __FILE__ == $0

我得到的回应是:

"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p>{\"hello\":\"world\"}</p></body></html>\n"

应该只有 json 部分。为什么在我没有要求的时候渲染html标签?

【问题讨论】:

  • 你配置了一些布局吗?
  • @thiagofm - 你找到答案了吗?

标签: ruby sinatra


【解决方案1】:

你见过this blog post吗?

require 'json'

get '/example.json' do
  content_type :json
  { :key1 => 'value1', :key2 => 'value2' }.to_json
end

我也将其修改为:

get '/example.json', :provides => :json do

停止使用路由的 HTML/XML 调用。由于您使用的是 sinatra-contrib gem,并且由于 Ruby 不需要所有这些括号等,您还可以将您作为示例给出的代码简化为:

require 'sinatra/json'

module MemcachedManager    
  class App < Sinatra::Base
    helpers Sinatra::JSON
    get '/', :provides => :json do
      json hello: 'world'
    end
  end
end

MemcachedManager::App.run! if __FILE__ == $0

【讨论】:

  • 仍然得到 "-//W3C//DTD HTML 4.0 Transitional//EN\" \"w3.org/TR/REC-html40/loose.dtd\">\n

    {\"你好\":\"世界\"}

    \n
  • @thiagofm 你用什么来提出请求?规范?卷曲?铬……?
  • 我只是进入页面并获取它的响应正文。
【解决方案2】:

试试看

content_type :json

json(...) 调用之前

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多