gpt4 book ai didi

ruby - 使用 body_stream 和参数发布请求

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:07 25 4
gpt4 key购买 nike

我正在构建某种代理。
当我在 Rack 应用程序中调用某个 url 时,我将该请求转发到另一个 url。

我转发的请求是一个带有文件和一些参数的POST。
我想添加更多参数。
但是文件可能会很大。所以我用 Net::HTTP#body_stream 而不是 Net::HTTP#body 发送它。

我将我的请求作为 Rack::Request 对象获取,并用它创建我的 Net::HTTP 对象。

req = Net::HTTP::Post.new(request.path_info)
req.body_stream = request.body
req.content_type = request.content_type
req.content_length = request.content_length

http = Net::HTTP.new(@host, @port)
res = http.request(req)

我尝试了几种方法来添加代理的参数。但是 Net::HTTP 中似乎没有任何内容允许将参数添加到 body_stream 请求,只能添加到 body 请求。

有没有更简单的方法来代理这样的 Rack 请求?还是一种将我的参数添加到我的请求的简洁方法?

最佳答案

嗯.. 在我看来,这是正常行为。我会解释为什么。如果你只能访问 Rack::Request,(我猜)你的中间件不解析响应(你不包括像 ActionController::ParamsParser 这样的东西),所以你没有访问参数的散列,但访问 StringIo。这个StringIO对应一个流like :

Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="param1"
value1
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--

您尝试使用 Net::HTTP 类执行的操作是:(1)。将请求解析为参数的散列; (2).将参数散列与您自己的参数合并; (3).重新创建请求。问题是 Net::HTTP 库不能做 (1),因为它是一个客户端库,而不是服务器库。

因此,您无法避免在添加新参数之前解析您的请求。

可能的解决方案:

  1. 在您的中间件之前插入 ActionController::ParamsParser。之后,您可以使用优秀的 rest-client lib 做类似的事情:

    RestClient.post (' http://your_server ' + request.path_info), :params => params.merge(your_params)

  2. 您可以尝试对 StringIO 对象进行包装,并在流的末尾添加您自己的参数。然而,这不是微不足道的,也不可取。

关于ruby - 使用 body_stream 和参数发布请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2621977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com