【问题标题】:Why is R HTTR content statement not producing the expected request body?为什么 R HTTR 内容语句没有产生预期的请求正文?
【发布时间】:2019-05-29 15:40:03
【问题描述】:

我正在使用 R 调用 Cyber​​source API。当我使用 GET 请求时,我获得了 200 的成功响应。当我读取响应的正文而不是取回 csv 数据时,我得到了一个 csv 文件路径的路径。我想知道我做错了什么。

content(request)给了

 "/space/download_reports/output/dailyreports/reports/2018/10/27/testrest/TRRReport-7931d82d-cf4a-71fa-e053-a2588e0ab27a.csv"

content(request) 的结果应该是数据而不是文件路径。

这是代码

library('httr')
merchant<-'testrest'
vcdate<-'Wed, 29 May 2019 10:09:48 GMT'
ho<-'apitest.cybersource.com'
URL<-'https://apitest.cybersource.com/reporting/v3/report-downloads?organizationId=testrest&reportDate=2018-10-27&reportName=TRRReport'
sign<-'keyid="08c94330-f618-42a3-b09d-e1e43be5efda", algorithm="HmacSHA256", headers="host (request-target) v-c-merchant-id", signature="7cr6mZMa1oENhJ5NclGsprmQxwGlo1j3VjqAR6xngxk="'
req<-GET(URL, add_headers(.headers=c('v-c-merchant-id'=merchant, 'v-c-date'=vcdate, 'Host'=ho, 'Signature'=sign)))
content(req)

这是 Cyber​​source 测试 api,您可以在其中验证生成的数据。

https://developer.cybersource.com/api/reference/api-reference.html

我正在尝试下载报告标签下的报告

【问题讨论】:

  • 您是否尝试过使用download.file 或任何其他功能来下载文件,因为您有了链接?
  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。您确定响应应该是数据吗?似乎它可能正试图向您发送重定向。能否引用 API 文档的相关部分?
  • 不,我没有。我在字面上使用 get 请求来调用 api 和 contenet(request) 来读取 ythe api 的正文。在邮递员中,它向我显示了一个 csv 数据而不是路径。我如何使用 download.file。 /space/download_reports/output/dailyreports/reports/2018/10/27/testrest/TRRReport-7931d82d-cf4a-71fa-e053-a2588e0ab27a.csv 看起来不像 URL 路径
  • 这看起来像一个相对路径。我怀疑根类似于您为其他 API 调用访问的根。至于使用download.file,你试过?download.file吗?
  • 不确定我如何在 httr GET 请求中使用 ?download.file。我已经编辑了我的问题并发布了我的代码。 @MrFlick 是的,它应该是数据。我已经在邮递员中对此进行了测试。

标签: r api mime-types httr


【解决方案1】:

老实说,我不确定这里发生了什么,但我确实认为我能够得到一些工作。

API 似乎喜欢以application/hal+json 格式返回数据,这不是httr 通常要求的格式。你可以用accept("*") 说你会接受任何东西所以你可以用:

req <- GET(URL, add_headers('v-c-merchant-id'=merchant, 
  'v-c-date'=vcdate, 
  'Host'=ho, 
  'Signature'=sign), accept("*"))

现在我们实际上正在取回我们想要的数据,但是httr 不知道如何自动解析它。所以我们需要自己解析。这似乎可以解决问题

readr::read_csv(rawToChar(content(req)), skip=1)

似乎有一个标题行,我们用skip= 跳过它,然后我们用readr::read_csv 将其余部分解析为CSV 文件。

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多