Faradayのmultipartの書き方

困っていたこと

Faradayを使ってサーバーへfileをpostとしようとしていました

ちなみにrequestを二回していているのはparameterがmultipart/form-dataで送信するものでなければ、application/x-www-form-urlencodedで送ってねという意味です

This request middleware setup affects POST/PUT requests in the following way:

Request::Multipart checks for files in the payload, otherwise leaves everything untouched;

Request::UrlEncoded encodes as "application/x-www-form-urlencoded" if not already encoded or of another type

Swapping middleware means giving the other priority. Specifying the "Content-Type" for the request is explicitly stating which middleware should process it.

File: README — Documentation for faraday (0.17.1)

conn = Faraday.new
conn.request :multipart
conn.request :url_encoded
conn.adapter :net_http

conn.post('https://example.com', parameter)

# => multipart/form-dataと見なされない

ただ何度試してもrequestヘッダーはContent-Type: application/x-www-form-urlencoded

parameterは適切なので多分Faradayのmultipartの指定の仕方が悪いんだよなあといろいろ調べてました

解決策

書き方変えたらうまく動きました

上の書き方はmultipart/form-dataになりません

動いたコードはこちら

conn = Faraday.new do |f| 
    conn.request :multipart
    conn.request :url_encoded 
    conn.adapter :net_http
end

conn.post('https://example.com', parameter)

# => multipart/form-dataと見なされる

一度Faraday.newしてからpropertyを指定していくやり方はダメでしたが、blockの中で指定するようにしたら動きました

Faradayの公式ドキュメントでもblockのなかで指定するような書き方になってました

lostisland.github.io

ただ最初のやり方も別にエラーにはなってないしやってることは同じな気がするんだが、、

なぜかはわかりません、時間があったら調べてみようと思います