Rubyのnet/httpライブラリを使ってmultipart/form-dataのリクエストをする
概要
ファイルアップロードする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する必要があります。
こちらの備忘録が少しでも役に立てれば嬉しいです!
記載内容に間違いや疑問点あればご指摘していただければと思います!!
Author And Source
この問題について(Rubyのnet/httpライブラリを使ってmultipart/form-dataのリクエストをする), 我々は、より多くの情報をここで見つけました https://zenn.dev/happyboy/articles/949eefc1a81430著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol