You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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实现代码如下:

  1. 加载依赖包
library(httr)
library(jsonlite)
library(base64enc)
  1. 读取文件并构造请求体
# 读取目标文件为原始二进制格式
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"
)
  1. 发送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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:10:48