読者です 読者をやめる 読者になる 読者になる

手が震えたらBARに行こう

駄文を吐き出して、今日もなんとか、元気に生きていこうと思います。twitterアカウントは、@tabunmuri255です。よろしくです。

Ruby On RailsでAPIサーバを作ってJSONを受け取る方法

送信側

送信側はpostでbodyにまんま下記を乗っける
サンプル元 JSON Example

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": [
                            "GML",
                            "XML"
                        ]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

Content-Typeは設定したほうがよいのは明らかだが、なくても、動く。

受信側

受信側は下記のようなコードを書く

class Api::ExamplesController < ApplicationController
  # この↓一文がないとCSRFチェックでこけるので、APIをやりとりしているControllerには必要
  skip_before_filter :verify_authenticity_token

  def create
    # 読み込み時に一度パースが必要
    json_request = JSON.parse(request.body.read)

    # パース後のデータを表示
    # p "json_request => #{json_request}"
    # p "#{json_request.to_hash}"

    # 各要素へのアクセス方法
    # p "glossary => #{json_request["glossary"]}"
    # p "glossary.title => #{json_request["glossary"]["title"]}"

    # この後、postされたデータをDBに突っ込むなり、必要な処理を記述してください。
    if !json_request.blank?
      personal = json_request
    else
      personal = {'status' => 500}
    end

    render :json => personal
  end
end

JSON::ParserError - A JSON text must at least contain two octets というエラーが出たら

それ、もしかして、request.body.readを2回呼んでおりませんでしょうか。
JSON « ツール工房 覚書
を見ると、どうしてももう一回呼びたい時は、request.body.rewindをやれとのこと。

JSON::ParserError - A JSON text must at least contain two octets!:

というエラーが出てしまいました。
これに悩まされたのですが、


request.body.read

ファイルポインタが最後にある状態で次のreadを呼んでしまっていたんですね。
rewindで戻してあげる必要があったわけです。

参考リンク
こちらのリンク先は非常に、お世話になりました。
ありがとうございました。
JSON « ツール工房 覚書


おわり。