6
4

More than 3 years have passed since last update.

【Ruby】APIへxmlでリクエスト

Last updated at Posted at 2019-10-20

はじめに

現在公開されているほとんどの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でリクエストを送る方法でわかりやすいのがなかなかなかったので、参考になれば幸いです。

6
4
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
6
4