如何使用R的httr::POST实现和Postman效果一致的POST请求
你当前代码的核心错误是重复JSON编码:你已经提前把请求体序列化为JSON字符串了,调用httr::POST时又加了encode = 'json'参数,此时httr会把你传入的整个JSON字符串作为普通文本再次做JSON编码,最终发出的请求体不是服务端期望的结构化JSON,自然无法返回有效数据。
解决方法1:直接使用预制JSON字符串
不再使用encode参数,手动指定Content-Type请求头即可:
test <- httr::POST( url = 'https://www.krl.dk/sirka/sirkaApi/tableApi', body = body, httr::add_headers(`Content-Type` = "application/json") )
解决方法2:用列表传参,让httr自动序列化
你也可以先把预制的JSON解析为R列表,再用encode='json'参数,避免手动构造JSON时可能出现的语法错误:
library(jsonlite) # 把JSON字符串转为R列表 body_list <- fromJSON(body) test <- httr::POST( url = 'https://www.krl.dk/sirka/sirkaApi/tableApi', body = body_list, encode = 'json' )
额外注意事项
- 确保你请求中携带的
sails.sidCookie未过期,且和Postman中使用的会话Cookie一致,否则服务端会拦截未授权的请求 - 若修改后仍返回异常,可以把Postman中的
User-Agent头也加到请求中,避免服务端做UA校验拦截R的默认请求标识 - 正常返回CSV数据时响应的
Content-Type应为text/csv,你可以请求成功后用httr::content(test, type = "text/csv")直接解析为数据框
内容的提问来源于stack exchange,提问作者Copenhagen_PDS
相关产品推荐
相关产品推荐

