【问题标题】:POST request with httr2 package带有 httr2 包的 POST 请求
【发布时间】:2022-06-11 03:14:26
【问题描述】:

它与另一个post有关

而不是rvest,我正在尝试使用httr2 包从这个链接请求数据:https://gnomad.broadinstitute.org/api/。不幸的是,我不太习惯,有人可以帮忙吗?

这是我迄今为止尝试过的,没有运气。

library(tidyverse)
library(httr2)

request("https://gnomad.broadinstitute.org/api/") %>%
  req_body_form(
    'chrom' = '1',
    'datasetId' = 'gnomad_r3', 
    'referenceGenome' = 'GRCh38',
    'start' = 55516868, 
    'stop' = 55516908
  ) %>%  
  req_perform()

Error in `resp_abort()`:
! HTTP 400 Bad Request.
Run `rlang::last_error()` to see where the error occurred.

【问题讨论】:

标签: r api web-scraping httr2


【解决方案1】:

API 需要的信息比您提供的要多得多!看起来您已经从 Chrome 的检查工具中提取了发送到 API 的参数,但只提供了“变量”部分。通过 Web 界面执行此操作时,页面上的 JS 会根据这些变量为您进行大量格式化,而 API 看到的内容实际上要广泛得多。您可以通过 URL here 看到这一点,它实际上显示了发送到 API 的完整请求(感谢 GraphiQL 制作了如此有用的 API 接口!)。

基本上,我们需要在 R 中创建整个字符串并将整个内容发送到 API,而不仅仅是您提供的变量列表。这是一段代码的 sn-p 代码:我们定义了一个“querymaker”函数,它接收我们的变量并输出完整的字符串,然后将其传递给 httr2 函数。

querymaker <- function(start, stop, chrom, ref_genome, dataset_id){
  paste0('{\n  region(start: ', start, ', stop: ', stop, ', chrom: "', chrom, '", reference_genome: ', ref_genome, ') {\n    clinvar_variants {\n      clinical_significance\n      clinvar_variation_id\n      gnomad {\n        exome {\n          ac\n          an\n          filters\n        }\n        genome {\n          ac\n          an\n          filters\n        }\n      }\n      gold_stars\n      hgvsc\n      hgvsp\n      in_gnomad\n      major_consequence\n      pos\n      review_status\n      transcript_id\n      variant_id\n    }\n    variants(dataset: ', dataset_id, ') {\n      consequence\n      flags\n      gene_id\n      gene_symbol\n      hgvs\n      hgvsc\n      hgvsp\n      lof\n      lof_filter\n      lof_flags\n      pos\n      rsids\n      transcript_id\n      transcript_version\n      variant_id\n      exome {\n        ac\n        ac_hemi\n        ac_hom\n        an\n        af\n        filters\n        populations {\n          id\n          ac\n          an\n          ac_hemi\n          ac_hom\n        }\n      }\n      genome {\n        ac\n        ac_hemi\n        ac_hom\n        an\n        af\n        filters\n        populations {\n          id\n          ac\n          an\n          ac_hemi\n          ac_hom\n        }\n      }\n      lof_curation {\n        verdict\n        flags\n      }\n    }\n  }\n}')
}
given_query <- querymaker(start = "55516868", stop = "55516908", chrom = "1", 
                ref_genome = "GRCh38", dataset_id = "gnomad_r3")

请注意带有很多换行符的超长字符串 - 这基本上是我将变量 pasteing 到的请求正文。现在我们可以将整个内容传递给 API 并获得 JSON 格式的响应:

library(httr2)
jsondata <- request("https://gnomad.broadinstitute.org/api/?") %>%
  req_body_json(list(query=given_query, variables="null")) %>%
  req_perform() %>%
  resp_body_json()

我们最终可以使用快速的sapply 函数从中提取变体 ID:

sapply(jsondata$data$region$variants, function(x)x$variant_id)
"1-55516880-T-C"  "1-55516902-T-G"  "1-55516903-G-GC" "1-55516905-C-CT"

(假设这仍然是您希望提取的内容)。

编辑:

请注意,如果您对您can shorten the query significantly(并减少服务器负载!)的变体 ID 感兴趣,请改用以下函数:

querymaker <- function(start, stop, chrom, ref_genome, dataset_id){
  paste0('{\n  region(start: ', start, ', stop: ', stop, ', chrom: "', chrom, '", reference_genome: ', ref_genome, '){variants(dataset: ', dataset_id, ') {\n      variant_id\n    }\n  }\n}')
}

其他一切都将正常运行。

【讨论】:

  • 太棒了,感谢您的解决方案和解释!很有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 2023-03-26
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多