Ну, как я понимаю, это нормальное поведение. Я объясню почему. Если у вас есть только доступ к Rack :: Request, (я полагаю, что) ваше промежуточное ПО не анализирует ответ (вы не включаете что-то вроде ActionController :: ParamsParser ), поэтому у вас нет доступа хешу параметров, но к StringIo. Этот StringIO соответствует потоку как :
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), поскольку это клиентская библиотека, а не серверная.
Таким образом, вы не можете избежать синтаксического анализа вашего запроса перед добавлением новых параметров.
Возможные решения:
Вставьте ActionController :: ParamsParser перед промежуточным программным обеспечением. После этого вы можете использовать отличный rest-client lib, чтобы сделать что-то вроде:
RestClient.post ('http://your_server' + request.path_info),: params => params.merge (your_params)
Вы можете попытаться создать оболочку для объекта StringIO и добавить в конце потока свои собственные параметры. Однако это не тривиально и не целесообразно.