🚀

Rubyのnet/httpライブラリを使ってmultipart/form-dataのリクエストをする

2021/09/11に公開

概要

ファイルアップロードするAPIを利用するために、multipart/form-dataを指定してpostリクエストを送るのにはまったので備忘録を残します。

実際のコード

uri = URI.parse("APIのURL")

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true if uri.scheme == "https"
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

req = Net::HTTP::Post.new(uri.request_uri)
header.each { |key, value| req[key.to_s] = value }

multipart_form_data = []
multipart_form_data << { key: "key_name", value: File.open(path/to/file).read, { filename: "hoge.txt", content_type: "application/json" } # 送信したいデータ数追加する

req.set_form(multipart_form_data, "multipart/form-data")

response = http.request(req)

# multipart_form_data の形式
# [
#   {
#     key: key_name, # nameに該当する文字列
#     value: file_data,  # 文字列やファイルデータ
#     { filename: file_name, content_type: content_type }
#   }
# ]

上記の内容でのリクエスト結果

POST /a HTTP/1.1

Content-Type: multipart/form-data; boundary=mTmYmULsGScCO6pEOyuGbg_NFUYqVt8WVVL358FAPTg_wk3i77nJnQ

--mTmYmULsGScCO6pEOyuGbg_NFUYqVt8WVVL358FAPTg_wk3i77nJnQ
Content-Disposition: form-data; name="key_name"; filename="hoge.txt"
Content-Type: application/json

file data
--mTmYmULsGScCO6pEOyuGbg_NFUYqVt8WVVL358FAPTg_wk3i77nJnQ--

注意点

Ruby(HTML5)の仕様上、filenameがnilの場合content_typeが無視されてしまう
content_typeのみ指定した場合でもcontent_typeが反映されるように, filenameに空文字を指定rする必要があります。

こちらの備忘録が少しでも役に立てれば嬉しいです!
記載内容に間違いや疑問点あればご指摘していただければと思います!!

Discussion