R语言发送x-www-form-urlencoded格式POST请求Payload编码失败
解决R语言POST请求中
mydata参数的编码问题 我猜你遇到的问题大概率是mydata的格式和API期望的编码逻辑不匹配——毕竟REST工具通常会自动帮我们处理很多编码细节,但在R里得咱们手动把控好这些细节才能和API的要求对齐。下面给你几个针对性的解决方案,你可以根据API的实际需求来选:
1. 如果API期望data是JSON字符串格式
很多API会要求data参数接收一个JSON序列化后的字符串,而不是直接传R的列表/数据框。这种情况下你需要先把mydata转成JSON字符串,再作为参数传入:
library(httr) library(jsonlite) # 将mydata序列化为JSON字符串(auto_unbox避免把单个值转成数组) mydata_json <- toJSON(mydata, auto_unbox = TRUE) query <- list( token = mytoken, module = "TeleMesura", class = "TeleMesuras", action = action, data = mydata_json ) response <- POST( url = myurl, body = query, encode = "form", verbose(), add_headers("Content-Type" = "application/x-www-form-urlencoded") )
这样服务器收到的data值就是标准的JSON字符串,和REST工具里的请求格式一致。
2. 如果API期望data是嵌套的表单键值对
有些API会把data的子参数拆成data.key1=value1&data.key2=value2这种形式的表单参数,这时候你需要把mydata展开成带前缀的键值对:
library(httr) # 给mydata的每个键加上"data."前缀,转换成表单参数格式 data_params <- setNames(mydata, paste0("data.", names(mydata))) # 合并基础参数和展开后的data参数 query <- c( list( token = mytoken, module = "TeleMesura", class = "TeleMesuras", action = action ), data_params ) response <- POST( url = myurl, body = query, encode = "form", verbose(), add_headers("Content-Type" = "application/x-www-form-urlencoded") )
3. 验证请求格式是否和REST工具一致
最稳妥的方式是对比R的请求和REST工具的请求:
- 看
verbose()输出的请求体内容,和REST工具里的请求体做对比,重点看data部分的差异 - 如果REST工具的请求体是类似
token=xxx&module=TeleMesura&data={"a":1,"b":2}的字符串,你可以直接把这个字符串作为body传入测试,确认能正常获取响应后,再改成动态生成的代码
内容的提问来源于stack exchange,提问作者alvaropr
相关产品推荐
相关产品推荐

