我是R的新手。我正在寻找一个连接到Azure表的脚本,我在这个线程中发现了一些有用的信息:连接到R 中的Azure表存储
然而,当我运行脚本时,我会遇到一个与发布问题的用户非常相似的错误,我无法找出问题所在。
这是我使用的代码(凭据已被修改(:
# 1B) Connects to an Azure Table based on the specifications for Shared Key: https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key
library(httr)
library(RCurl)
library(bitops)
library(xml2)
# Stores credentials in variable
Account <- "storageaccount"
Container <- "usage"
Key <- "key"
# Composes URL
URL <- paste0(
"https://",
Account,
".table.core.windows.net",
"/",
Container
)
# Requests time stamp
requestdate <- format(Sys.time(), "%a, %d %b %Y %H:%M:%S %Z", tz = "UTC" )
content_lenght <- 0
# Composes signature string
signature_string <- paste0(
"GET", "n", # HTTP Verb
"n", # Content-MD-5
"text/xml", "n", # Content-Type
requestdate, "n", # Date
"/", Account, "/", Container # Canonicalized resource
)
# Composes header string
header_string <- add_headers(
Authorization=paste0(
"SharedKey ",
Account,
":",
RCurl::base64(
digest::hmac(
key = RCurl::base64Decode(
Key, mode = "raw"
),
object = enc2utf8(signature_string),
algo = "sha256",
raw = TRUE
)
)
),
'x-ms-date' = requestdate,
'x-ms-version' = "2022-01-15",
'Content-type' = "text/xml"
)
# Creates request
xml_body = content(
GET(
URL,
config = header_string,
verbose()
)
)
当我运行它时,我得到这个错误:
-> GET /Usage HTTP/1.1
-> Host: storageaccount.table.core.windows.net
-> User-Agent: libcurl/7.64.1 r-curl/4.3.2 httr/1.4.2
-> Accept-Encoding: deflate, gzip
-> Accept: application/json, text/xml, application/xml, */*
-> Authorization: SharedKey key
-> x-ms-date: Mon, 17 Jan 2022 15:47:30 UTC
-> x-ms-version: 2022-01-15
-> Content-type: text/xml
->
<- HTTP/1.1 400 The value for one of the HTTP headers is not in the correct format.
<- Content-Length: 371
<- Content-Type: application/xml
<- Server: Microsoft-HTTPAPI/2.0
<- x-ms-request-id: 0986de5d-9002-0064-1eb9-0b1166000000
<- Date: Mon, 17 Jan 2022 15:47:30 GMT
<-
No encoding supplied: defaulting to UTF-8.
如有任何帮助,我们将不胜感激。
此外,我不知道这是否相关,但我已经被提示安装包Rtools好几次了,但当我搜索这个包时,我找不到它。
提前感谢!
感谢您的帮助!
这就是有效的代码:
library(httr)
library(RCurl)
library(bitops)
library(xml2)
# Stores credentials in variable
Account <- "storageaccount"
Container <- "Usage"
Key <- "key"
# Composes URL
URL <- paste0(
"https://",
Account,
".table.core.windows.net",
"/",
Container
)
# Requests time stamp
requestdate <- format(Sys.time(), "%a, %d %b %Y %H:%M:%S %Z", tz = "GMT")
# As per Microsoft's specs, an empty line is needed for content-length
content_lenght <- 0
# Composes signature string
signature_string <- paste0(
"GET", "n", # HTTP Verb
"n", # Content-MD-5
"text/xml", "n", # Content-Type
requestdate, "n", # Date
"/", Account, "/", Container # Canonicalized resource
)
# Composes header string
header_string <- add_headers(
Authorization=paste0(
"SharedKey ",
Account,
":",
RCurl::base64(
digest::hmac(
key = RCurl::base64Decode(
Key, mode = "raw"
),
object = enc2utf8(signature_string),
algo = "sha256",
raw = TRUE
)
)
),
'x-ms-date' = requestdate,
'x-ms-version' = "2020-12-06",
'Content-type' = "text/xml"
)
# Creates request
xml_body = content(
GET(
URL,
config = header_string,
verbose()
),
"text"
)
Get_data <- xml_body # Gets data as text from API
From_JSON <-fromJSON(Get_data, flatten = TRUE) # Parses text from JSON
Table_name <- as.data.frame(From_JSON) # Saves data to a table
我添加了最后三行来解析JSON格式的数据,并将其保存到一个表中。