はじめに
現在公開されているほとんどのAPIがデータフォーマットJSONでリクエストを送るAPIかと思いますが、
稀にデータフォーマットがXMLのAPIがありますので、そのリクエスト方法をメモとして残しておきたいと思います。
環境
- Ruby 2.5.0
今回はRailsなどは使用せず、ピュアなRubyのみで実装を行なっていきたいと思います。
ファイル構成
- index.rb
- hoge_api.rb
ファイル名などは適当ですmm
リクエスト用のクラスを作成
このクラスでxml引数にとりをAPIへリクエストを行わせます。
Rubyの標準ライブラリを使用するため、特別何かのインストールは必要ありません。
# hoge_api.rb
require 'net/http'
require 'uri'
require 'json'
require 'rexml/document'
require 'open-uri'
class HogeApi
attr_reader :body, :code, :json
def initialize(xml)
# リクエストヘッダ
headers = {
'Content-Type' => 'application/xml'
}
# 環境変数にエンドポイントを設定しておく
uri = URI.parse("#{ENV['API_URL']}")
# xmlのAPIは仕様が古くsslに対応していないものが多いので、以下のように80番ポートでアクセス。sslに対応している場合はsslに対応するように設定を変更してください
http = Net::HTTP.new(uri.host, 80)
http.use_ssl = false
response = http.post("#{uri.path}?#{uri.query}", xml, headers)
@body = response.body # APIからのresponseのxmlをそのまま返す
@code = response.code # ステータスコードを返す
@json = xml_to_json(response.body) # xmlをjsonに変換したデータを返す
end
# xmlフォーマットのデータを扱い易いようにjsonデータに変換するメソッド
def xml_to_json(xml)
doc = REXML::Document.new(xml)
hash = Hash.from_xml(doc.to_s)
hash.to_json
end
end
実行用のファイル
リクエスト用のxml
<?xml version='1.0' encoding='UTF-8' ?>
<foods>
<food>
<name>バナナ</name>
<color>黄色</color>
</food>
<food>
<name>リンゴ</name>
<color>赤</color>
</food>
</foods>
上記のようなxmlを使用します。
require 'json'
require 'net/http'
require './hoge_api' # 作成したリクエスト用のクラスを読み込み
def main
food_name = 'アップル'
food_color = '赤'
# 上記のxmlデータを文字列にして変数に格納
xml = "<?xml version='1.0' encoding='UTF-8' ?><foods><food><name>#{food_name}</name><color>#{food_color}</color></food></foods>"
# HogeApiクラスでリクエストを行い、返却された結果を変数responseに代入
response = HogeApi.new(xml)
# 返却されたデータが必要ない場合は、以下でもいい
HogeApi.new(xml)
end
以上となります。
xmlでリクエストを送る方法でわかりやすいのがなかなかなかったので、参考になれば幸いです。