使用Ruby Net::HTTP调用multipart/form-data API时出现无边界错误
解决Net::HTTP调用multipart/form-data API时的边界缺失问题
问题原因
你遇到的错误是因为服务器未接收到multipart请求的边界标识。Ruby标准库的Net::HTTP#set_form方法在手动传入字符串'multipart/form-data'作为content type时,不会自动生成并添加边界参数到请求头,导致服务器无法解析请求体。
修复方案
1. 改用:multipart符号自动生成边界
将原代码中的:
request.set_form form_data, 'multipart/form-data'
替换为:
request.set_form form_data, :multipart
当传入:multipart时,Net::HTTP会自动生成随机边界,并将Content-Type请求头设置为multipart/form-data; boundary=xxxxxx,服务器就能正确识别并解析请求。
2. 优化表单数据格式(可选但推荐)
- 为
email_data字段指定application/json的content type,确保服务器正确解析JSON内容 - 以二进制模式读取文件,避免编码问题
- 显式指定文件名,符合HTTP规范
修改后的form_data:
form_data = [ [ 'email_data', '{"message":"Test\tMessage","type":"mobi","priority":"LOW","email":{"to_email_ids":["awadesh@temp.com"],"cc_email_ids":[],"bcc_email_ids":[],"from_email_id":"automation@temp.com","subject":"subject - test email","attachment":[]}}', { content_type: 'application/json' } ], [ 'attachment', File.open('/Users/dummy/Desktop/Screenshot 2022-11-07 at 10.45.11 AM.png', 'rb'), { filename: 'Screenshot 2022-11-07 at 10.45.11 AM.png' } ] ]
完整修复后的代码
require "uri" require "net/http" url = URI("[base_url]/rest/v1/companies/11/notifications/email-with-attachment?content_type=static") https = Net::HTTP.new(url.host, url.port) https.use_ssl = true request = Net::HTTP::Post.new(url) request["client"] = "mobi" form_data = [ [ 'email_data', '{"message":"Test\tMessage","type":"mobi","priority":"LOW","email":{"to_email_ids":["awadesh@temp.com"],"cc_email_ids":[],"bcc_email_ids":[],"from_email_id":"automation@temp.com","subject":"subject - test email","attachment":[]}}', { content_type: 'application/json' } ], [ 'attachment', File.open('/Users/dummy/Desktop/Screenshot 2022-11-07 at 10.45.11 AM.png', 'rb'), { filename: 'Screenshot 2022-11-07 at 10.45.11 AM.png' } ] ] request.set_form form_data, :multipart response = https.request(request) puts response.read_body
验证逻辑
修改后,Net::HTTP会自动处理边界生成和请求头设置,请求格式会与curl的有效请求一致,服务器就能正常解析multipart数据。
内容的提问来源于stack exchange,提问作者Awadesh
相关产品推荐
相关产品推荐

