如何正确实现Plumber接口接收.rds文件与文件名并消除解析报错?
解决Plumber端点接收RDS文件与字符串参数的报错问题并支持Swagger
问题根源
你之前的代码同时声明了多个parser(@parser multi/rds/text/none),导致Plumber的解析逻辑冲突;另外手动调用mime::parse_multipart(req)绕过了Plumber自带的解析流程,最终触发了"No suitable parser found"报错——虽然功能能跑,但解析环节的异常没被处理。
正确实现方案
只保留@parser multi即可(multipart/form-data请求仅需这个parser就能同时处理文件和文本参数),同时添加Swagger兼容的注释,让Plumber自动处理参数解析,消除报错。
修改后的Plumber代码(plumber.R)
library(plumber) #* 上传RDS文件并指定保存路径 #* @post /write_rds #* @parser multi #* @param rds_file file: 待上传的RDS文件 #* @param file_path character: 文件保存路径(例如"test.rds") function(rds_file, file_path) { # 读取上传的RDS文件内容 rds_data <- readRDS(rds_file$datapath) # 保存为RDS格式(用saveRDS比save更规范,对应readRDS的读写逻辑) saveRDS(rds_data, file = file_path) # 返回成功响应 list(status = "success", saved_file_path = file_path) }
测试请求代码
library(magrittr) library(httr) # 生成测试用RDS文件 tmpfile <- tempfile(fileext = ".rds") saveRDS(iris, file = tmpfile) # 发起POST请求 res <- POST( "http://127.0.0.1:8966/write_rds", body = list( rds_file = upload_file(tmpfile), # 无需手动指定MIME类型,multi parser自动识别 file_path = "test.rds" ), encode = "multipart" ) %>% content() print(res)
Swagger支持
启动Plumber服务后,直接访问http://127.0.0.1:8966/__docs__/就能看到自动生成的Swagger文档,可直接在界面上上传文件、输入保存路径进行接口测试。
内容的提问来源于stack exchange,提问作者Michael Bird
相关产品推荐
相关产品推荐

