Rails 路由接受 http 和 json 请求

Posted

技术标签:

【中文标题】Rails 路由接受 http 和 json 请求【英文标题】:Rails route accetping http and json requests 【发布时间】:2013-04-30 12:32:45 【问题描述】:

我正在使用 rails 创建一个 REST api,我有一个与路由以及如何接受我的 api 请求有关的简单问题。

在我的路线文件中,我有以下代码:

namespace :api do
   namespace :v1 do
      resources :productOp, :path => "product", :defaults =>  :format => 'json' 
   end
end

使用此代码,如果我在网络浏览器中访问该网址:

http://localhost:3000/api/v1/product

它工作正常。另一方面,它只接受 json 格式的帖子

如果我删除 ":defaults => :format => 'json' " 我无法在网络浏览器中打开相同的 url,我会收到 406 http 消息,因为它试图找到我的#index html

谁能为我解释为什么当我删除“:defaults => :format => 'json' ”时会发生这种情况? 以及如何制作一个接受 http post 请求和 json 的 API?

只是为了添加信息,我的控制器总是以 json 格式响应,因为我在第一行的控制器“respond_to :json”中包含了这一点。

【问题讨论】:

你的动作是什么样的? 【参考方案1】:

当你在那里有默认哈希值时,你是在告诉 Rails 默认情况下将请求设为 JSON,无论你是否指定它。通过删除它,rails 不会这样做,所以当你尝试自己导航到页面时,rails 会假定它是一个 HTML 请求,如果你不处理它就会失败。

忘记了

在您的控制器操作中,您可能没有告诉 rails 它也可以返回 HTML。如果它只会返回 JSON,那么 rails 无法正常工作是正确的,但请注意,这并不是说它无法找到,您得到的是 406 而不是 404。

尝试类似:

respond_to do |format|
  format.json  render json: @whatever 
  format.html 
end

然后,html 将简单地呈现您的索引视图,json 请求将在 JSON 中返回您想要的任何内容

【讨论】:

谢谢,但它没有用,如果我这样做,我会收到一条模板丢失消息...当我提出请求时,它会尝试查看视图文件夹,而不是显示 json 如果您正在执行标准 URL 请求,那就对了。这样做会导致 Rails 假定您需要 HTML,并且format.html 将触发。如果您想运行 URL 请求并返回 JSON,那么只需请求 URL http://localhost:3000/api/v1/product.json,您应该返回 JSON :)

以上是关于Rails 路由接受 http 和 json 请求的主要内容,如果未能解决你的问题,请参考以下文章

API Rails 上的获取请求不返回 json

即使 Rails 服务器配置为接受所有请求,Angular 发布请求也未通过预检

jquery ajax post请求不接受绝对url rails应用程序

Rspec:在路由规范中添加一些头请求

为啥 Rails 无法识别请求标头中的 `Accept: application/json`?

GET 和 POST 请求的相同 Rails 4 路由