Httr header returns 数字文字中的无效字符“-”
Httr header returns invalid character '-' in numeric literal
我正在使用 httr
访问 API for stockfighter,一款 CTF 风格的交易游戏。
GET 函数工作正常,但当我尝试使用 headers 中的 API 密钥进行身份验证时,它似乎没有工作。这是我的 place_order
函数
place_order <- function(acct, exchange, stock, price, qty,
direction = c("buy", "sell"),
type = c("limit", "market", "fill-or-kill",
"immediate-or-cancel")) {
# Place a stock order
if (!exists("key")) stop("No authorisation key defined.")
direction <- match.arg(direction)
type <- match.arg(type)
bdy <- list("account" = acct, "venue" = exchange, "symbol" = stock,
"price" = price, "qty" = qty, "direction" = direction,
"orderType" = type)
rurl <- paste(burl, "/venues/", exchange, "/stocks/", stock, "/orders",
sep = "")
r <- POST(rurl, body = bdy, add_headers(`X-Starfighter-Authorization` = key))
return(content(r))
}
这是我在 return 中得到的:
$ok
[1] FALSE
$error
[1] "invalid character '-' in numeric literal"
看来 JSON 没有正确转义破折号。
这是我 post 到 httpbin 而不是 API:
时得到的响应
$args
named list()
$data
[1] ""
$files
named list()
$form
$form$account
[1] "RB34256134"
$form$direction
[1] "buy"
$form$orderType
[1] "limit"
$form$price
[1] "12400"
$form$qty
[1] "100"
$form$symbol
[1] "FOOBAR"
$form$venue
[1] "TESTEX"
$headers
$headers$Accept
[1] "application/json, text/xml, application/xml, */*"
$headers$`Accept-Encoding`
[1] "gzip, deflate"
$headers$`Content-Length`
[1] "751"
$headers$`Content-Type`
[1] "multipart/form-data; boundary=------------------------49a2e51c0c6926dd"
$headers$Host
[1] "httpbin.org"
$headers$`User-Agent`
[1] "libcurl/7.43.0 r-curl/0.9.4 httr/1.0.0.9000"
$headers$`X-Starfighter-Authorization`
[1] "OBFUSCATED KEY HERE"
$json
NULL
$origin
[1] "1.125.48.185"
$url
[1] "http://httpbin.org/post"
我觉得这可能是一个非常愚蠢的简单错误,但我无法解决。
编辑:
这是使用 requests
和 json
的 python 方法,效果很好。
def sf_post(path, data, key, **kwargs):
base_url = "https://api.stockfighter.io/ob/api/"
r = requests.post("%s/%s" % (base_url, path), data = data, headers = {'X-Starfighter-Authorization': key}, **kwargs)
return(r)
def order(self, price, qty, direction, order_type):
data = dict(account = self.account, venue = self.exchange, symbol = self.symbol, price = price, qty = qty,
direction = direction, orderType = order_type)
r = sf_post("%s/orders" % self.rurl, data = json.dumps(data), key = self.key)
return r.json()
cph = Stock("CPH", "EXMBEX", account = "ACCOUNTCODEHERE", key = os.environ.get("SF_KEY"))
cph.order(5000, qty = 100, direction = "buy", order_type = "limit")
{u'direction': u'buy', u'ok': True, u'ts': u'2016-01-24T00:35:21.148877285Z', u'fills': [{u'price': 4694, u'ts': u'2016-01-24T00:35:21.148881279Z', u'qty': 100}], u'originalQty': 100, u'orderType': u'limit', u'symbol': u'CPH', u'venue': u'EXMBEX', u'account': u'SSM90915021', u'qty': 0, u'id': 754, u'totalFilled': 100, u'open': False, u'price': 5000}
我以为我可能遗漏了一些愚蠢的东西,正如@hadley 在评论中指出的那样。我需要将 encode = "json"
添加到我的 POST 调用中。对于后代,这里是更新的功能代码:
place_order <- function(acct, exchange, stock, price, qty,
direction = c("buy", "sell"),
type = c("limit", "market", "fill-or-kill",
"immediate-or-cancel")) {
if (!exists("key")) stop("No authorisation key defined.")
direction <- match.arg(direction)
type <- match.arg(type)
bdy <- list("account" = acct, "venue" = exchange, "symbol" = stock,
"price" = price, "qty" = qty, "direction" = direction,
"orderType" = type)
rurl <- paste(burl, "venues/", exchange, "/stocks/", stock, "/orders",
sep = "")
r <- POST(rurl, body = bdy,
add_headers(`X-Starfighter-Authorization` = key),
encode = "json")
return(content(r))
}
我正在使用 httr
访问 API for stockfighter,一款 CTF 风格的交易游戏。
GET 函数工作正常,但当我尝试使用 headers 中的 API 密钥进行身份验证时,它似乎没有工作。这是我的 place_order
函数
place_order <- function(acct, exchange, stock, price, qty,
direction = c("buy", "sell"),
type = c("limit", "market", "fill-or-kill",
"immediate-or-cancel")) {
# Place a stock order
if (!exists("key")) stop("No authorisation key defined.")
direction <- match.arg(direction)
type <- match.arg(type)
bdy <- list("account" = acct, "venue" = exchange, "symbol" = stock,
"price" = price, "qty" = qty, "direction" = direction,
"orderType" = type)
rurl <- paste(burl, "/venues/", exchange, "/stocks/", stock, "/orders",
sep = "")
r <- POST(rurl, body = bdy, add_headers(`X-Starfighter-Authorization` = key))
return(content(r))
}
这是我在 return 中得到的:
$ok
[1] FALSE
$error
[1] "invalid character '-' in numeric literal"
看来 JSON 没有正确转义破折号。
这是我 post 到 httpbin 而不是 API:
时得到的响应$args
named list()
$data
[1] ""
$files
named list()
$form
$form$account
[1] "RB34256134"
$form$direction
[1] "buy"
$form$orderType
[1] "limit"
$form$price
[1] "12400"
$form$qty
[1] "100"
$form$symbol
[1] "FOOBAR"
$form$venue
[1] "TESTEX"
$headers
$headers$Accept
[1] "application/json, text/xml, application/xml, */*"
$headers$`Accept-Encoding`
[1] "gzip, deflate"
$headers$`Content-Length`
[1] "751"
$headers$`Content-Type`
[1] "multipart/form-data; boundary=------------------------49a2e51c0c6926dd"
$headers$Host
[1] "httpbin.org"
$headers$`User-Agent`
[1] "libcurl/7.43.0 r-curl/0.9.4 httr/1.0.0.9000"
$headers$`X-Starfighter-Authorization`
[1] "OBFUSCATED KEY HERE"
$json
NULL
$origin
[1] "1.125.48.185"
$url
[1] "http://httpbin.org/post"
我觉得这可能是一个非常愚蠢的简单错误,但我无法解决。
编辑:
这是使用 requests
和 json
的 python 方法,效果很好。
def sf_post(path, data, key, **kwargs):
base_url = "https://api.stockfighter.io/ob/api/"
r = requests.post("%s/%s" % (base_url, path), data = data, headers = {'X-Starfighter-Authorization': key}, **kwargs)
return(r)
def order(self, price, qty, direction, order_type):
data = dict(account = self.account, venue = self.exchange, symbol = self.symbol, price = price, qty = qty,
direction = direction, orderType = order_type)
r = sf_post("%s/orders" % self.rurl, data = json.dumps(data), key = self.key)
return r.json()
cph = Stock("CPH", "EXMBEX", account = "ACCOUNTCODEHERE", key = os.environ.get("SF_KEY"))
cph.order(5000, qty = 100, direction = "buy", order_type = "limit")
{u'direction': u'buy', u'ok': True, u'ts': u'2016-01-24T00:35:21.148877285Z', u'fills': [{u'price': 4694, u'ts': u'2016-01-24T00:35:21.148881279Z', u'qty': 100}], u'originalQty': 100, u'orderType': u'limit', u'symbol': u'CPH', u'venue': u'EXMBEX', u'account': u'SSM90915021', u'qty': 0, u'id': 754, u'totalFilled': 100, u'open': False, u'price': 5000}
我以为我可能遗漏了一些愚蠢的东西,正如@hadley 在评论中指出的那样。我需要将 encode = "json"
添加到我的 POST 调用中。对于后代,这里是更新的功能代码:
place_order <- function(acct, exchange, stock, price, qty,
direction = c("buy", "sell"),
type = c("limit", "market", "fill-or-kill",
"immediate-or-cancel")) {
if (!exists("key")) stop("No authorisation key defined.")
direction <- match.arg(direction)
type <- match.arg(type)
bdy <- list("account" = acct, "venue" = exchange, "symbol" = stock,
"price" = price, "qty" = qty, "direction" = direction,
"orderType" = type)
rurl <- paste(burl, "venues/", exchange, "/stocks/", stock, "/orders",
sep = "")
r <- POST(rurl, body = bdy,
add_headers(`X-Starfighter-Authorization` = key),
encode = "json")
return(content(r))
}