Rails中通过POST方法传输文件时报400 Unsupported method错误如何解决?
错误原因排查
- 核心原因:重复设置请求表单导致格式异常。代码先调用
req.set_form配置了multipart/form-data类型的文件上传参数,后续又调用req.set_form_data传入mac参数,set_form_data方法会直接覆盖已设置的请求体,同时自动将请求头的Content-Type修改为application/x-www-form-urlencoded,完全覆盖了之前的multipart配置,服务器接收的请求不符合文件上传接口要求,因而返回400错误。 - 参数格式错误:
set_form方法要求传入二维数组格式的表单参数,每个表单字段为独立的[字段名, 字段值]子数组,代码中传入的['upload', File.open("#{file_name}")]为一维数组,会导致参数解析异常。 - 可选排查项:确认目标URL确实支持POST请求,且路径填写完整,无遗漏接口路径后缀。
修复方案
将所有表单参数统一放到set_form的参数列表中,无需单独调用set_form_data,修正后的代码如下:
uri = URI(URL常量) req = Net::HTTP::Post.new(uri) # 所有参数统一放在二维数组中传入set_form form_params = [ ['upload', File.open(file_name)], ['mac', mac] ] req.set_form(form_params, 'multipart/form-data') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true res = http.request(req) case res when Net::HTTPSuccess, Net::HTTPRedirection Rails.logger.info "File sent successfully" # 正常业务逻辑 else
额外注意事项
- 打开的文件使用完成后建议手动关闭,也可以使用
File.open的块调用形式自动释放资源,避免文件描述符泄漏。 - 若修复后仍报错,可打印
req['Content-Type']和req.body,确认请求格式是否匹配目标接口的要求。
内容的提问来源于stack exchange,提问作者Aniket Sarkar
相关产品推荐
相关产品推荐

