使用httr进行API POST文件上传的JSON编码错误及解决咨询
解决httr POST请求上传文件时的
form_file JSON序列化错误 问题根源
你遇到的Error: No method asJSON S3 class: form_file错误,是因为upload_file()生成的form_file对象无法被自动序列化为JSON结构。你的API要求cv字段是包含data(原始文件数据)、filename、type的嵌套结构,而非multipart/form-data格式的文件字段,因此不能直接使用upload_file()。
转换后的httr代码(基于典型curl示例)
假设你的可用curl示例为:
curl -X POST https://your-api-endpoint.com/submit \ -H "Content-Type: application/json" \ -d '{ "cv": { "data": "$(cat your-resume.pdf | base64)", "filename": "your-resume.pdf", "type": "application/pdf" }, "user_name": "Jane Smith", "position": "Data Analyst" }'
对应的R语言httr实现代码如下:
- 加载依赖包
library(httr) library(jsonlite) library(base64enc)
- 读取文件并构造请求体
# 读取目标文件为原始二进制格式 file_content <- readBin("your-resume.pdf", what = "raw", n = file.info("your-resume.pdf")$size) # 将二进制数据编码为base64字符串(多数JSON API要求此格式传递文件) file_base64 <- base64encode(file_content) # 构造符合API要求的嵌套请求体 request_body <- list( cv = list( data = file_base64, filename = "your-resume.pdf", type = "application/pdf" ), user_name = "Jane Smith", position = "Data Analyst" )
- 发送POST请求
response <- POST( url = "https://your-api-endpoint.com/submit", body = request_body, encode = "json", # 自动将列表序列化为JSON add_headers("Content-Type" = "application/json") ) # 查看响应结果 cat(rawToChar(response$content))
关键说明
- 如果你的API接受原始二进制数据而非base64编码,可直接将
file_content赋值给cv$data,但需确认API是否支持在JSON中传递raw二进制(多数场景下base64是更通用的选择)。 - 若API实际要求multipart/form-data格式但嵌套结构特殊,可改用
multipart()构造请求体,但根据你的报错信息,JSON格式的嵌套结构是更匹配的解决方案。
内容的提问来源于stack exchange,提问作者DeduciveR
相关产品推荐
相关产品推荐

