使用带有 graphql 查询的 API 在 R 上引发 401 错误但在 Python 上工作正常

Posted

技术标签:

【中文标题】使用带有 graphql 查询的 API 在 R 上引发 401 错误但在 Python 上工作正常【英文标题】:Consuming API with graphql queries throwing 401 error on R but working fine on Python 【发布时间】:2019-12-05 03:24:59 【问题描述】:

我需要通过 API 访问一些信息。我需要在 R 上执行此操作。我尝试在 Python 上执行此操作,但效果很好,但在 R 上执行相同操作时遇到 401 错误。

我有 API 密钥,也知道要执行的查询。我在下面附上了 Python 和 R 代码。

Python:

import requests

headers = 
    'Content-Type': 'application/json',
    'Authorization': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX',


query = """

    boards (ids: 157244624) 
        permissions
    

"""

response = requests.get('https://XYZwebsite.com/', headers=headers, json='query': query)

R:

require(httr)

headers = c(
  `Content-Type` = 'application/json',
  `Authorization` = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
)

data = '
    boards (ids: 157244624) 
        permissions
    
'

res <- GET(url = 'https://XYZwebsite.com/', add_headers(.headers=headers), body = data)

我是否遗漏了 R 代码中的某些内容?它看起来几乎一样,但由于某种奇怪的原因,我在 R 上收到 401 错误。

【问题讨论】:

【参考方案1】:

或许可以试试:

r <- GET("https://XYZwebsite.com/", 
         add_headers(`Content-Type` = "application/json",
                     `Authorization` = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"),
         body = data)

编辑: 使用gist,您可以:

先认证:

token <- GQL(auth_query)$authenticate$jwtToken

然后您可以通过传递您在响应中获得的令牌来运行您的查询:

GQL(current_person_query, .token = token)

看起来你想同时做两件事。

如果您已经拥有令牌,那么您似乎传递错误:

auth_header <- paste("bearer", .token)
res <- POST(.url, body = pbody, encode="json", add_headers(Authorization=auth_header), ...)

因为它应该作为“承载 XXXXXXXXXXXXXXXXX”传递。

【讨论】:

我猜“数据”部分的格式不正确。 url &lt;- "http://httpbin.org/post" body &lt;- list(a = 1, b = 2, c = 3) # Form encoded r &lt;- POST(url, body = body, encode = "form") 在the docs 中,正文是一个列表,而不是字符串。 (至少,对于 POST 请求)。 是的,没错。但我的数据是 GraphQL 查询的形式。我参考了 (gist.github.com/rentrop/83cb1d8fc8593726a808032e55314019) 这个 github 文档,结果发现我们可以在数据部分使用 GraphQl 查询本身。请看看,让我知道你的想法。 我认为您的代码实际上是在尝试进行身份验证,但看了一眼,您似乎收到了 401(未经授权的错误),因为您必须在运行查询之前进行身份验证。查看更新。【参考方案2】:

在我的情况下,api 密钥已过期......真的很长的旅程让我去:

    放大更新接口 遍历所有 选择 api 密钥 输入新的 api 密钥名称 输入 365 天,无进一步变化 amplify push 不会检测到变化,所以使用 amplify push --force 也许有帮助

【讨论】:

顺便说一句,我从没想过***的输入会像编辑器那么难

以上是关于使用带有 graphql 查询的 API 在 R 上引发 401 错误但在 Python 上工作正常的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用 httr 翻译 curl 调用,并带有多个调用

带有注释的 SQL 查询从文件导入 R

带有 systemd 的 getaddrinfo() API

使用 Checkbox 确定 MySql 查询

Jquery 删除、添加和查找查询

在api请求准备好之前无法弄清楚如何跳过查询,因此它不会在带有useSWR的apollo useQuery中返回未定义的变量