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 « ツール工房 覚書
おわり。