使用R语言httr2包POST请求gnomAD API报400错误如何解决
gnomAD API httr2请求400错误修复方案
问题背景
本问题关联同平台使用rvest提取gnomAD数据库信息的相关讨论,本次方案不依赖rvest包,直接通过httr2向gnomAD官方API接口发送POST请求获取数据。原实现因httr2使用方式错误,持续返回HTTP 400 Bad Request错误,以下为可复现的错误代码与修正方案。
原始错误代码
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.
错误原因
gnomAD提供的接口为GraphQL类型接口,不支持表单格式的参数提交,原代码使用req_body_form发送表单参数是触发400错误的核心原因。GraphQL接口要求请求体为JSON格式,必须包含查询语句与查询变量两部分内容,同时需要指定正确的JSON请求头。
修正后可运行代码
library(tidyverse) library(httr2) # 定义GraphQL查询语句,可根据需要提取的字段调整返回内容 region_query <- ' query getRegionVariants($chrom: String!, $datasetId: DatasetId!, $referenceGenome: ReferenceGenomeId!, $start: Int!, $stop: Int!) { region(chrom: $chrom, start: $start, stop: $stop, reference_genome: $referenceGenome) { variants(dataset: $datasetId) { variant_id pos ref alt genome { ac an af } } } } ' # 发送正确格式的请求 resp <- request("https://gnomad.broadinstitute.org/api/") %>% req_headers(`Content-Type` = "application/json") %>% req_body_json(list( query = region_query, variables = list( chrom = "1", datasetId = "gnomad_r3", referenceGenome = "GRCh38", start = 55516868, stop = 55516908 ) )) %>% req_perform() # 解析返回结果 result <- resp_body_json(resp)
关键注意点
- 必须使用
req_body_json构造JSON格式的请求体,不能使用req_body_form传表单参数 - 请求头必须明确声明
Content-Type为application/json - 请求体固定包含两个核心字段:
query字段存放GraphQL查询语法,variables存放所有查询参数(染色体编号、数据集版本、参考基因组版本、区间起止坐标等) - 可根据实际数据需求修改GraphQL查询语句中的返回字段,支持添加变异注释、频率筛选、基因关联信息等各类gnomAD开放字段
内容的提问来源于stack exchange,提问作者HoelR
相关产品推荐
相关产品推荐

