我正在尝试连接到degreedays.net API。 R中的代码基于ruby www.degreedays.net/api/ruby中的API代码。我将测试访问权限用于开发人员。
library(base64url)
library(digest)
library(httr)
url <- "http://apiv1.degreedays.net/xml"
tstamp <- strftime(as.POSIXlt(Sys.time(), "UTC", "%Y-%m-%dT%H:%M:%S"), "%Y-%m-%dT%H:%M:%S%z")
random <- as.hexmode(as.integer(runif(1, 1000000, 10000000)))
request <- paste(
'<RequestEnvelope>',
'<SecurityInfo>',
'<Endpoint>', url,'</Endpoint>',
'<AccountKey>test-test-test</AccountKey>',
'<Timestamp>', tstamp, '</Timestamp>',
'<Random>', random, '</Random>',
'</SecurityInfo>',
'<LocationDataRequest>',
'<PostalCodeLocation><PostalCode>02532</PostalCode><CountryCode>US</CountryCode></PostalCodeLocation>',
'<DataSpecs>',
'<DatedDataSpec key="dailyHDDForLast7Days">',
'<HeatingDegreeDaysCalculation>',
'<FahrenheitBaseTemperature>65</FahrenheitBaseTemperature>',
'</HeatingDegreeDaysCalculation>',
'<DailyBreakdown>',
'<LatestValuesPeriod><NumberOfValues>7</NumberOfValues></LatestValuesPeriod>',
'</DailyBreakdown></DatedDataSpec></DataSpecs></LocationDataRequest></RequestEnvelope>',
sep = "")
securityKey <- 'test-test-test-test-test-test-test-test-test-test-test-test-test'
signatureBytes <- hmac(key = securityKey, object = request, algo = 'sha256')
requestParameters <- list(
request_encoding = 'base64url',
signature_method = 'HmacSHA256',
signature_encoding = 'base64url',
encoded_request = base64_urlencode(request),
encoded_signature = base64_urlencode(signatureBytes)
)
r <- POST(url = url, body = requestParameters, verbose())
content(r, "text")
红宝石代码完美运行。通过R中的上述实现,我收到消息:
对不起,您的HTTP请求格式似乎有问题。请检查您的HTTP请求是否遵循www.degreedays.net/api/中API文档所述的格式,并请注意此错误不是由您的XML引起的。如果使用的是客户端库(而不是直接使用XML API),则客户端库可能已过期或以某种不兼容的方式从默认设置中进行了修改。缺少encoding_request参数。
使用curlPerform发布请求会得到相同的结果。我用不同的参数做了几次尝试。我在hmac函数中使用了serialize = FALSE。我尝试了sha1,因为degreedays.net API允许这样做。我使用了不同的随机值。
任何想法如何使其起作用?预先感谢!