0

我已经使用 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”)它可以工作。

有任何想法吗?

谢谢。

4

2 回答 2

5

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

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

这就是我如何解决这个问题(对于任何最终来到这里的谷歌员工)

步骤 1:研究错误代码

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


第 2 步:诊断问题

因为 400 级错误代码是客户端错误代码,所以我确定该错误一定与应用 2 相关(在这种情况下,应用 2 是客户端向应用 1 请求数据)。我看到您在应用程序 1 中对 JSON 进行了一些格式化,并在应用程序 2 中查找了类似的代码但没有看到,所以我认为错误是因为应用程序 2 的Content-Type标头与应用程序 1 不同。内容-Type 基本上告诉应用程序/浏览器在发送/接收数据时各自使用什么语言。您存储在 Content-Type 中的值是MIME 类型,其中有很多。

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

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

第3步:修复thangz

将此行添加到应用程序 2 中的类:

self.format = :json

我相信您也可以使用 headers 方法调整 Content-Type 标头,但 API 没有显示如何执行此操作的示例代码。使用 headers 方法调整 Content-Type 只是一种“更难”的方法,并且因为调整 Content-Type 是format为了简化流程而创建的常见轨道。我看到 API 有一个调整类的格式属性的示例,该类可以方便地使用 json并读取format方法/属性“设置format从 mime 类型引用发送和接收的属性”又名设置 Content-Type HTTP标题。

于 2012-04-13T14:36:06.053 回答
1

除了 CoryDanielson 的回答。

即使我的应用程序使用 :xml 格式(这是 Cory 指出的默认设置),我仍然必须包含

self.format = :xml

为了修复406错误。

于 2013-09-02T01:03:21.253 回答