Почему оператор содержимого R HTTR не создает ожидаемое тело запроса? - PullRequest
2 голосов
/ 29 мая 2019

Я использую R для вызова API Cybersource. Когда я использую запрос 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)

Вот тестовый API Cybersource, где вы можете проверить полученные данные.

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

Я пытаюсь загрузить отчет на вкладке отчетности

1 Ответ

1 голос
/ 29 мая 2019

Честно говоря, я не совсем уверен, что здесь происходит, но я думаю, что смог заставить что-то работать.

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=, а затем мы анализируем остальное как файл CSV с readr::read_csv.

...