获取响应代码= 406.响应消息=解析JSON时不可接受的错误

时间:2012-04-12 20:55:54

标签: ruby-on-rails-3 json

我使用ActiveResource构建了一个Rails应用程序,该应用程序由另一个应用程序调用(Rails)。

情况是我将第一个应用程序中的信息公开为JSON,如下所示:

应用1:

class PromotionsController < ApplicationController

  # GET /promotions
  # GET /promotions.xml
  def index
    @promotions = Promotion.all

    respond_to do |format|
      format.json  { render :json => @promotions }
    end
  end
end

我通过ActiveResource模型在App 2上收到它,如下所示:

class Promotion < ActiveResource::Base
  self.site = "app_1_url"
  self.element_name = "promotion"
end

当我想将数据读取为JSON时,执行以下操作,我收到406 Not Acceptable错误消息:

class PromotionsController < ApplicationController
  # GET /promotions
  # GET /promotions.xml
  def index
    @promotions = Promotion.all

    respond_to do |format|
      format.json { render :json => @promotions }
    end
  end
end

但是,当我尝试将信息解析为XML(与上面显示的代码相同时,除了将“json”更改为“xml”之外)它可以工作。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:5)

您必须将接收数据的应用程序(App 2)的格式更改为JSON

class Promotion < ActiveResource::Base
  #your code
  self.format = :json #XML is default
end

以下是我如何解决这个问题(对于任何最终到此处的googlers)

第1步:研究错误代码

<强> Per Wikipedia
406不可接受
请求的资源只能根据请求中发送的Accept标头生成不可接受的内容 (基本上,您收到的数据与您想要的语言不同)


第2步:诊断问题

因为400级错误代码是客户端错误代码,所以我确定该错误必须是App 2(在这种情况下,app 2是请求来自app 1的数据的客户端)。我看到你在应用程序1中为JSON做了一些格式化,并在App 2中查找了类似的代码而没有看到它,所以我认为错误是App 2有一个不同的 Content-Type 标题而不是App 1. Content-Type基本上告诉应用程序/浏览器在发送/接收数据时每个语言的语言。您在内容类型中存储的值是 MIME Type ,其中有很多。

你说XML类型有效,但JSON没有,所以我检查了rails ActiveResource API (在App 2中使用)寻找一些标头或内容类型的方法并且看到了一个format方法和属性与您在App Controller的Action Controller中使用的方法和属性相匹配。我还看到format默认为XML(如果没有提供)。

#Returns the current format, default is ActiveResource::Formats::XmlFormat.
def format
   read_inheritable_attribute(:format) || ActiveResource::Formats[:xml]
end

第3步:修复thangz

将此行添加到app 2中的类:

self.format = :json

我确信您也可以使用headers方法调整Content-Type标头,但API没有示例代码显示如何执行此操作。使用headers方法调整Content-Type只是一种“更难”的方法,因为调整Content-Type是如此常见的rails创建format来简化流程。我看到API有an example of adjusting the format attribute of the class that conveniently uses json并读取format方法/属性“设置从mime类型引用中发送和接收属性的format”又设置内容类型HTTP标头。

答案 1 :(得分:1)

除了CoryDanielson的回答。

即使我的应用程序正在使用:xml格式(默认设置为Cory注释)我仍然必须包含

self.format = :xml

为了修复406错误。