【问题标题】:Why doesn't my controller return JSON response?为什么我的控制器不返回 JSON 响应?
【发布时间】:2018-02-06 14:15:44
【问题描述】:

这里是代码

def index
  @projects = Project.all.includes(:todos) 
  respond_to do |format|
    format.html 
    format.json { render json  @projects => @projects.to_json(:include => :todos) }
  end
end

我尝试像这样使用 Ion 从我的 Android 应用程序获取 JSON

String serverAdress = "https://the-url.com/"
Ion.with(context)
            .load(serverAdress)
            .asJsonObject()

但是得到解析错误,因为没有从那里返回。如果有单独的控制器方法专门返回 JSON 响应,我可以获取 JSON,因此此代码有效

def indexJson
  @projects = Project.all.includes(:todos) 
  render json  @projects => @projects.to_json(:include => :todos)
end

但同样,我无法在那里发布任何内容(我的意思是其他单独的 JSON 控制器方法)。我在 rails 设置或获取数据时错过了什么?谢谢。

【问题讨论】:

  • 你在第二个例子中得到了什么 JSON?它在我看来有点古怪,因为它使用一组项目作为键,并将它们的 JSON 化自我作为值。我不确定这是不是核心问题,因为我对 Android 代码一无所知,但也许值得一看……(另外,请注意:Project.includes(:todos) 在这里就足够了 - 不需要@987654325 @ :) )
  • @SRack 默认发送,我懒得改了。似乎 rails 需要某种已定义的请求。我不知道 Rails 的标头中必须包含什么才能将其确认为 JSON 请求。请参阅下面的评论。

标签: android ruby-on-rails json ruby-on-rails-5


【解决方案1】:

您需要从 Ion 发送 json 请求才能获得 JSON 响应。

在第二种情况下,您尚未定义 HTML 返回格式,因此默认情况下,rails 会向您发送 json 响应,这就是第二种情况有效的原因

【讨论】:

  • 据我了解,Ion 默认发送 JSON 请求。我尝试显式设置 .setMultipartContentType("application/json"),但出现错误“连接在响应完成之前关闭。”我不知道 rails 期望什么样的请求。
【解决方案2】:

偶然我在某个网站上遇到了一些控制器评论

# GET /projects
# GET /projects.json

并尝试将“.json”附加到我的地址请求中,并且成功了!为什么没有告诉任何地方?,我认为'json'在请求参数的某个地方,而不是在地址本身。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多