我faraday
用来处理对内部API的一些请求。API端点使用CSRF令牌,因此我也使用faraday-cookie_jar
。
对于两个API端点,它们需要一个:multipart
请求。其他人没有。
有什么方法可以利用相同的Connection
对象,但是可以切换是否在执行一个:multipart
或一个:url_encoded
请求?
当前,根据我发出的请求类型,我必须使用两个连接。在完成至少1个请求后,似乎无法更改连接的请求方法。
@connection = Faraday.new(url: 'http://localhost:3000') do |faraday|
faraday.request :url_encoded
faraday.use :cookie_jar
faraday.adapter Faraday.default_adapter
end
@connection.get '/something'
# try to change to :multipart
@connection.request :multipart # => Faraday::RackBuilder::StackLocked: can't modify middleware stack after making a request
发出请求后,似乎不允许您进行切换。我知道您可以通过传递一个块来对每个请求本身进行一些修改,但是我似乎找不到在其中进行修改的位置:multipart
。
提前致谢。
创建连接(和)时,您将要同时包括两个中间件选项,然后使用显式标头进行切换。:url_encoded
:multipart
Content-Type
根据法拉第自述文件,您可以同时指定两者。摘录:
Faraday.new(...) do |conn| # POST/PUT params encoders: conn.request :multipart conn.request :url_encoded conn.adapter :net_http end
此请求中间件设置通过以下方式影响POST / PUT请求:
Request::Multipart
检查有效负载中的文件,否则一切保持不变;Request::UrlEncoded
如果尚未编码或其他类型,则编码为“ application / x-www-form-urlencoded”。
因此添加:multipart
仍然允许使用url编码的帖子,因为仅当有效负载中有文件时才重要。然后,如果您明确地Content-Type
为文件上传设置了文件,则应该没问题-法拉第将使用正确的请求中间件,因为您明确地告诉它使用多部分。但是,如果您未指定,则默认为url编码。
# works using :url_encoded
@connection.post '/something' do |req|
req.body = { some: 'posted fields' }
end
# works using :multipart because Content-Type was explicitly set
@connection.post '/some_file_endpoint' do |req|
req.headers['Content-Type'] = 'multipart/form-data'
req.body = { file_field: Faraday::UploadIO.new(file_path, 'text/plain') }
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句