在R中调用JSON REST API认证时如何获取会话令牌
问题根源分析
你的问题出在请求体的编码格式不匹配:你用httr的POST时指定了encode = "form",这会把登录数据编码成表单格式(application/x-www-form-urlencoded)发送,但服务器实际需要的是JSON格式的请求体(对应你curl命令里的-H "Content-Type: application/json")。虽然服务器返回了200 OK,但因为请求格式不对,没有返回你需要的_id令牌。
修正后的R代码
1. 正确发送JSON格式的登录请求
library(httr) # 准备登录数据 login <- list( email = "my@email.com", password = "mypass" ) # 发送POST请求,指定JSON编码(自动设置Content-Type: application/json) res <- POST( url = "https://dashboard.server.eu/login", body = login, encode = "json", # 关键:用JSON编码替代form verbose() # 可选,用来查看请求详情,确认Content-Type是否正确 ) # 解析响应内容成JSON对象 response_content <- content(res, "parsed") # 提取_id令牌 token <- response_content$`_id` cat("拿到的会话令牌:", token, "\n")
2. 携带令牌发起后续GET请求
对应你提供的AngularJS示例,用httr实现的代码如下:
# 构造请求头 auth_headers <- add_headers( Authorization = paste0("Session ", token), `content-type` = "application/json;charset=UTF-8", accept = "application/json,text/plain" ) # 发送GET请求 data_res <- GET( url = "https://dashboard.server.eu/", auth_headers ) # 解析返回的数据 result_data <- content(data_res, "parsed")
验证请求格式的小技巧
你可以通过verbose()输出的日志,确认请求的Content-Type是否为application/json——这是和你原来的代码最核心的区别。curl命令里明确指定了这个头,所以能正确拿到令牌,修正后的R代码也会自动设置这个头。
内容的提问来源于stack exchange,提问作者user3341592
相关产品推荐
相关产品推荐

