API端点浏览器可访问,R语言GET请求返回401未授权问题求助
解决R中GET调用NY参议院API返回401的问题
第一步:修正URL拼接错误
你当前的URL拼接会生成类似https://legislation.nysenate.gov/api/3/bills/search?term=A6156//?key=xxx的错误格式,双斜杠和重复的?会导致参数识别失败,这是触发401的原因之一。正确的多参数拼接应该用&连接,或者直接用query参数传递,避免手动拼接出错:
方式1:手动修正拼接逻辑
base <- "https://legislation.nysenate.gov" searchbill <- paste0("/api/3/bills/search?term=", data$name1[i], "&key=", key) searchresult <- GET(paste0(base, searchbill))
方式2:用query参数规范传递(更推荐)
searchresult <- GET( url = paste0(base, "/api/3/bills/search"), query = list( term = data$name1[i], key = key ) )
第二步:处理会话认证(Cookie)
从你登出浏览器就无法访问的情况来看,这个API不仅需要API key,还依赖登录后的会话Cookie。你需要先模拟登录获取有效Cookie,再带着Cookie发起请求:
- 获取登录所需参数:打开浏览器开发者工具,在登录页面提交登录操作,查看POST请求的表单参数(通常包含
username、password,还有可能需要csrf_token这类验证字段)。 - 模拟登录并保存会话:
# 创建会话对象,自动保存Cookie session <- httr::handle(base_url = base) # 先提取CSRF令牌(如果登录页面要求) library(rvest) login_page <- read_html(paste0(base, "/login")) csrf_token <- login_page %>% html_element("input[name='csrf_token']") %>% html_attr("value") # 发送登录请求,替换成实际的登录接口和参数 httr::POST( url = paste0(base, "/login"), # 替换为实际登录接口路径 handle = session, body = list( username = "你的登录用户名", password = "你的登录密码", csrf_token = csrf_token ), encode = "form" ) # 用同一个会话发起API请求,自动携带登录后的Cookie searchresult <- GET( url = paste0(base, "/api/3/bills/search"), handle = session, query = list( term = data$name1[i], key = key ) )
验证请求结果
请求完成后,可以用以下代码查看状态码和返回内容:
# 查看状态码,200表示成功 httr::status_code(searchresult) # 查看返回内容 httr::content(searchresult)
内容的提问来源于stack exchange,提问作者majulito
相关产品推荐
相关产品推荐

