Ruby 法拉第连接:切换请求模式?

Ruby 法拉第连接:切换请求模式?,ruby,faraday,Ruby,Faraday,我正在使用faraday处理一些对内部API的请求。API端点使用CSRF令牌,因此我也使用faraday-cookie\u jar 对于一些API端点,它们需要一个:multipart请求。其他人则不然 问题: 是否有任何方法可以使用相同的连接对象,但可以切换您是执行:多部分还是执行:url\u编码的请求 目前,我必须使用两个连接,这取决于我提出的请求类型。在连接完成至少一个请求后,您似乎无法更改连接的请求方法 @connection=Faraday.new(url:'http://local

我正在使用
faraday
处理一些对内部API的请求。API端点使用CSRF令牌,因此我也使用
faraday-cookie\u jar

对于一些API端点,它们需要一个
:multipart
请求。其他人则不然

问题: 是否有任何方法可以使用相同的
连接
对象,但可以切换您是执行
:多部分
还是执行
:url\u编码的
请求

目前,我必须使用两个连接,这取决于我提出的请求类型。在连接完成至少一个请求后,您似乎无法更改连接的请求方法

@connection=Faraday.new(url:'http://localhost:3000|法拉第|
请求:url_编码
用途:饼干罐
faraday.adapter faraday.default_适配器
结束
@connection.get'/something'
#尝试更改为:多部分
@connection.request:multipart#=>Faraday::RackBuilder::StackLocked:发出请求后无法修改中间件堆栈
它似乎不允许您在提出请求后切换。我知道您可以通过传递一个块来为每个请求本身修改一点请求,但我似乎找不到在其中切换到
:multipart
的修改位置


提前感谢。

呼叫
@connection.request:multipart
Faraday::request::multipart
添加到
@connecton.builder.handlers
。如果要删除某些内容,可以操纵该数组

我并不认为弄乱法拉第(相对)的内部结构是个好主意。保持两个连接听起来是一个更好的计划。

在创建连接时,您需要同时包括两个中间件选项(
:url\u encoded
:multipart
),然后使用显式
内容类型
标题进行切换

根据,您可以同时指定它们。摘录:

此请求中间件设置以以下方式影响POST/PUT请求:

  • Request::Multipart
    检查有效负载中的文件,否则将保持所有内容不变
  • Request::UrlEncoded
    如果尚未编码或其他类型,则编码为“application/x-www-form-UrlEncoded”
  • 因此,添加
    :multipart
    仍然允许url编码的帖子,因为它只在负载中有文件时才起作用。然后,如果您显式地为文件上传设置
    内容类型
    ,您应该会很好-法拉第将使用正确的请求中间件,因为您显式地告诉它使用multipart。但如果不指定,它将默认为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
    
    # 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