JSON API対応のRuby Clientである json_api_client gem を試します。
準備
JSON API 準拠のAPIサーバーをあらかじめ立てておきます。
今回は id:hkdnet さんの下記の記事をもとに Ruby on Rails の API サーバーを作っておきます。
対象モデル
- User
- name:string
- screen_name:string
- password:string
- has_many :tweets
- Tweet
- user_id :integer
- text:text
- belongs_to :user
サンプル
Gemfile
# 略 gem 'json_api_client', '~> 1.0' # 略
Sample
require "json_api_client" module ClientSample class Base < JsonApiClient::Resource self.site = "http://localhost:3000/" end class User < Base has_many :tweets end class Tweet < Base end end require "pp" ## Ref puts "==Ref==" pp ClientSample::User.all.take(2) pp ClientSample::Tweet.all.take(2) ## Create puts "==Create==" puts "===User===" pp "User.size = #{ClientSample::User.all.size}" suzuki = ClientSample::User.create(name: "suzuki", screen_name: "suzuki86") pp suzuki pp "User.size = #{ClientSample::User.all.size}" puts "===Tweet===" pp "User.size = #{ClientSample::Tweet.all.size}" suzuki_tweet1 = ClientSample::Tweet.create(text: "suzuki zutsuki", user_id: suzuki.id) suzuki_tweet2 = ClientSample::Tweet.create(text: "suzuki satsuki", user_id: suzuki.id) pp suzuki_tweet1 pp suzuki_tweet2 pp suzuki.tweets pp "Tweet.size = #{ClientSample::Tweet.all.size}" ## update puts "==Update==" suzuki.name = "suzuki updated" suzuki.save pp suzuki suzuki.name = "suzuki updated" suzuki.save suzuki_tweet1 = ClientSample::Tweet.find(id: suzuki.id).first suzuki_tweet1.text = "#{suzuki_tweet1.text} updated" suzuki_tweet1.save pp suzuki_tweet1
実行結果
==Ref== [#<ClientSample::User:@attributes={"id"=>"1", "type"=>"users", "name"=>"name0 update", "screen_name"=>"screen_name0"}>, #<ClientSample::User:@attributes={"id"=>"2", "type"=>"users", "name"=>"name1", "screen_name"=>"screen_name1"}>] [#<ClientSample::Tweet:@attributes={"id"=>"1", "type"=>"tweets", "user_id"=>1, "text"=>"name0 < text0"}>, #<ClientSample::Tweet:@attributes={"id"=>"2", "type"=>"tweets", "user_id"=>1, "text"=>"name0 < text1"}>] ==Create== ===User=== "User.size = 23" #<ClientSample::User:@attributes={"name"=>"suzuki", "screen_name"=>"suzuki86", "type"=>"users", "id"=>"24"}> "User.size = 24" ===Tweet=== "User.size = 70" #<ClientSample::Tweet:@attributes={"text"=>"suzuki zutsuki", "user_id"=>24, "type"=>"tweets", "id"=>"71"}> #<ClientSample::Tweet:@attributes={"text"=>"suzuki satsuki", "user_id"=>24, "type"=>"tweets", "id"=>"72"}> [#<ClientSample::Tweet:@attributes={"id"=>"71", "type"=>"tweets", "user_id"=>24, "text"=>"suzuki zutsuki"}>, #<ClientSample::Tweet:@attributes={"id"=>"72", "type"=>"tweets", "user_id"=>24, "text"=>"suzuki satsuki"}>] "Tweet.size = 72" ==Update== #<ClientSample::User:@attributes={"name"=>"suzuki updated", "screen_name"=>"suzuki86", "type"=>"users", "id"=>"24"}> #<ClientSample::Tweet:@attributes={"id"=>"24", "type"=>"tweets", "user_id"=>3, "text"=>"name2 < text3 updated"}>