3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyの標準ライブラリ net/http を使って kintone の REST API を叩いてみる

Last updated at Posted at 2019-10-04

このところ学習用にkintoneのREST API を色々と叩いているのですが、そういえば大好きなRubyからだってHTTPリクエスト投げれればできそうじゃんね。と思ったんでやってみました。

色々試しながら上手くいったものから、都度追加していくよ。

レコード

レコードの取得(GET)

get_record.rb
url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/record.json"
uri = URI.parse(url)
api_token = ENV['SELECT_TOKEN']
req = Net::HTTP::Get.new(uri.path)
req['X-Cybozu-API-Token'] = api_token
req['Content-Type'] = 'application/json'
req.body = JSON.generate({"app" => "100", "id" => "1"})

Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
  res = http.request(req)
  case res.code.to_i
  when 200
    pp JSON.parse(res.body)
  else
    pp %Q(#{res.code} #{res.message})
    pp JSON.parse(res.body)
  end
}
get_records.rb
url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/records.json"
uri = URI.parse(url)
api_token = ENV['SELECT_TOKEN']
req = Net::HTTP::Get.new(uri.path)
req['X-Cybozu-API-Token'] = api_token
req['Content-Type'] = 'application/json'
fields = ["\$id", "商品名", "金額"]
query = %q(金額 >= "50000")
req.body = JSON.generate({"app" => "100", "fields" => fields, "query" => query, "totalCount" => true})

レコードの一括取得

カーソルの作成

get_records_cursor.rb
url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/records/cursor.json"
uri = URI.parse(url)
api_token = ENV['SELECT_TOKEN']
req = Net::HTTP::Post.new(uri.path)
req['X-Cybozu-API-Token'] = api_token
req['Content-Type'] = 'application/json'
fields = ["\$id", "商品名", "金額"]
query = %q(金額 >= "50000")
req.body = JSON.generate({"app" => "100", "fields" => fields, "query" => query, "totalCount" => true, "size" => "500"})
cursor = ""
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
  res = http.request(req)
  case res.code.to_i
  when 200
    pp JSON.parse(res.body)
    cursor = JSON.parse(res.body)["id"]
    pp cursor
  else
    pp %Q(#{res.code} #{res.message})
    pp JSON.parse(res.body)
  end
}

カーソル範囲のレコード取得

get_records_cursor.rb
req = Net::HTTP::Get.new(uri.path)
req['X-Cybozu-API-Token'] = api_token
req['Content-Type'] = 'application/json'
req.body = JSON.generate({"id" => cursor})
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
  res = http.request(req)
  case res.code.to_i
  when 200
    pp JSON.parse(res.body)
  else
    pp %Q(#{res.code} #{res.message})
    pp JSON.parse(res.body)
  end
}

レコードの削除

レコードの一括削除

ids に レコードIDの配列を渡します。

delete_records.rb
req_delete = Net::HTTP::Delete.new(uri.path)
req_delete['X-Cybozu-API-Token'] = api_token
req_delete['Content-Type'] = 'application/json'
req_delete.body = JSON.generate(
  {"app" => app_id,
   "ids" => ary_ids}
)
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
  res = http.request(req_delete)
  case res.code.to_i
  when 200
    pp JSON.parse(res.body)
  else
    pp %Q(#{res.code} #{res.message})
    pp JSON.parse(res.body)
  end
}

ファイルアップロード

kintoneの領域にファイルをアップロードします。

ファイルアップロード

file.rb
begin
  upload_file = File.open '1.txt', "r"
  data = [["file", upload_file, {"filename" => "1.txt", "content_type" => "text/plain"}]]
  url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/file.json"
  uri = URI.parse(url)
  api_token = ENV['SELECT_TOKEN']
  req = Net::HTTP::Post.new(uri.path)
  req['X-Cybozu-API-Token'] = api_token
  req['Content-Type'] = 'multipart/form-data'
  req.set_form(data, "multipart/form-data")
  pp req  
  Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
    res = http.request(req)
    res.each_header do |name, val|
      puts "name=#{name}, val=#{val}"
    end
    case res.code.to_i
    when 200
      pp JSON.parse(res.body)
    else
      pp %Q(#{res.code} #{res.message})
      pp JSON.parse(res.body)
    end
  }
rescue => exception
  pp exception
  upload_file.close
end

アップロードしたファイルとレコードの関連付け

アップロードしたファイルの filekey と kintoneレコードを紐付けします。
レコードの更新APIを利用します。

file_upload.rb
begin
  url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/record.json"
  uri = URI.parse(url)
  api_token = ENV['UPDATE_TOKEN']
  req = Net::HTTP::Put.new(uri.path)
  req['X-Cybozu-API-Token'] = api_token
  req['Content-Type'] = 'application/json'

  req.body = JSON.generate({
      "app" => "100",
      "id" => "1",
      "record" => {"file" => {"value" => [{"fileKey"=>"590279cd-6657-419f-8fac-d760a4a6caaa"}]}}
    })
    Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
    res = http.request(req)
    res.each_header do |name, val|
      puts "name=#{name}, val=#{val}"
    end
    case res.code.to_i
    when 200
      pp JSON.parse(res.body)
    else
      pp %Q(#{res.code} #{res.message})
      pp JSON.parse(res.body)
    end
  }
rescue => exception
  pp exception
end

アプリ

フォームの設定の取得

フィールドの一覧を取得する

get_app_fields.rb
require 'rubygems'
require 'bundler/setup'
require 'dotenv/load'
require 'net/http'
require 'uri'
require 'json'
require 'base64'
require 'pp'

url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/app/form/fields.json"
uri = URI.parse(url)
pass_auth = Base64.strict_encode64("#{ENV['UID']}:#{ENV['PASS']}")

req = Net::HTTP::Get.new(uri.path)
req['Content-Type'] = 'application/json'
req['X-Cybozu-Authorization'] = pass_auth
req.body = JSON.generate({"app" => "100"})
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
  res = http.request(req)
  case res.code.to_i
  when 200
    pp JSON.parse(res.body)
  else
    pp %Q(#{res.code} #{res.message})
    pp JSON.parse(res.body)
  end
}

アプリのプロセス管理の設定の取得

プロセスにはAPIトークン認証は使えません。代わりにパスワード認証を使います。

status.rb
url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/app/status.json"
uri = URI.parse(url)
req = Net::HTTP::Get.new(uri.path)
pass_auth = Base64.strict_encode64("#{ENV['UID']}:#{ENV['PASS']}")
req['X-Cybozu-Authorization'] = pass_auth
req['Content-Type'] = 'application/json'
req.body = JSON.generate({"app" => "100", "lang" => "ja"})

Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
  res = http.request(req)
  case res.code.to_i
  when 200
    pp JSON.parse(res.body)
  else
    pp %Q(#{res.code} #{res.message})
    pp JSON.parse(res.body)
  end
}
  • クエリ文字列

結果は同じです。

status_url.rb
url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/app/status.json?app=100&lang=ja"
uri = URI.parse(url)
pass_auth = Base64.strict_encode64("#{ENV['UID']}:#{ENV['PASS']}")

Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
  res = http.get("#{uri.path}?#{uri.query}", {'X-Cybozu-Authorization' => pass_auth})
  res.each_header do |name, val|
    puts "name=#{name}, val=#{val}"
  end
  case res.code.to_i
  when 200
    pp JSON.parse(res.body)
  else
    pp %Q(#{res.code} #{res.message})
    pp JSON.parse(res.body)
  end
}

スペース情報の取得

スペース情報の取得はAPIトークン認証が使えません。
代わりにパスワード認証を使ってください。

space.rb
url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/space.json"
uri = URI.parse(url)
req = Net::HTTP::Get.new(uri.path)
pass_auth = Base64.strict_encode64("#{ENV['UID']}:#{ENV['PASS']}")
req['X-Cybozu-Authorization'] = pass_auth
req['Content-Type'] = 'application/json'
req.body = JSON.generate({"id" => "1"})

Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
  res = http.request(req)
  case res.code.to_i
  when 200
    pp JSON.parse(res.body)
  else
    pp %Q(#{res.code} #{res.message})
    pp JSON.parse(res.body)
  end
}

API情報

API 一覧の取得

認証情報は必要ありません。

apis.rb
url = "https://#{ENV['SUBDOMAIN']}.cybozu.com/k/v1/apis.json"
uri = URI.parse(url)
req = Net::HTTP::Get.new(uri.path)

Net::HTTP.start(uri.host, uri.port, :use_ssl => true) {|http|
  res = http.request(req)
  case res.code.to_i
  when 200
    pp JSON.parse(res.body)
  else
    pp %Q(#{res.code} #{res.message})
    pp JSON.parse(res.body)
  end
}

環境

  • macOS 10.13.6
  • ruby 2.5.0

リンク

雑記

やってみたら、まあ普通にできた。
やっぱりRubyいいな。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?