R调用POST()请求API返回Status 422报错'value is not a valid list'如何解决?
R调用POST接口返回422错误的解决方法
422状态码代表服务器可识别请求的实体格式,但无法处理其中的语义内容,该问题核心原因是R的httr::POST()默认将请求体识别为表单编码格式,不会自动序列化为JSON,也不会对应设置Content-Type: application/json请求头;而Python的requests.post(json=xxx)方法会自动完成JSON序列化和请求头配置,因此可以正常请求。
修复步骤
- 先确保你已安装加载
httr包,如需手动序列化JSON可额外加载jsonlite包 - 调整POST请求的传参方式,以下两种写法均可用:
写法1:使用内置encode参数(最简方案)
library(httr) # 构造请求参数,和你之前的写法保持一致 req_body <- list( request_data_type = "你的参数值", request_cancer_type = "你的参数值", request_genes = c("GENE1", "GENE2", "GENE3") ) # 发起请求,新增encode = "json"参数即可 response <- POST( url = "https://example.com/workstation", body = req_body, encode = "json" ) # 校验状态码 print(status_code(response)) # 解析返回结果为数据框 res_content <- content(response, as = "parsed") result_df <- as.data.frame(res_content)
写法2:手动序列化JSON(适合需自定义JSON格式的场景)
library(httr) library(jsonlite) req_body <- list( request_data_type = "你的参数值", request_cancer_type = "你的参数值", request_genes = c("GENE1", "GENE2", "GENE3") ) response <- POST( url = "https://example.com/workstation", # 手动序列化为JSON,auto_unbox=TRUE避免单元素值被转为数组 body = toJSON(req_body, auto_unbox = TRUE), # 手动指定请求头 add_headers("Content-Type" = "application/json") )
注意事项
如果修改后仍返回422,可执行content(response, as = "text")打印服务器返回的具体错误信息,可直接定位到参数的校验问题。
内容的提问来源于stack exchange,提问作者JAM
相关产品推荐
相关产品推荐

