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 モデルを介してアプリ 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: エラー コードの調査

ウィキペディアによると:
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 (アプリ 2 で使用) を調べて、いくつかのヘッダーまたはコンテンツ タイプ メソッドを探しformat、アクション コントローラーで使用したものと一致するメソッドとプロパティを見つけました。アプリ 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、メソッド/プロパティが「formatMIME タイプ参照から属性が送受信されるように設定する」別名 Content-Type HTTP を設定することを読みました。ヘッダ。

于 2012-04-13T14:36:06.053 に答える
1

CoryDanielson の回答に加えて。

私のアプリケーションが :xml 形式を使用している場合でも (Cory がデフォルトで設定されているように)、私はまだ含める必要がありました

self.format = :xml

406エラーを修正するために。

于 2013-09-02T01:03:21.253 に答える