2016-01-23 20 views
0

我使用httr來訪問stockfighter,一個CTF風格的交易遊戲的API。Httr標題在數字字面上返回無效字符' - '

GET函數沒有任何問題,但是當我嘗試使用標頭中的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)) 
} 

這是我得到的回報:

$ok 
[1] FALSE 

$error 
[1] "invalid character '-' in numeric literal" 

看來,JSON是不正確逃逸破折號。

這是我得到的迴應時,我張貼到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" 

我覺得這可能是一個非常愚蠢的簡單的錯誤,但我不能工作了。

編輯:

下面是使用requestsjson蟒蛇方法完美的作品。

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} 
+0

是「X-Starfighter-Authorization」變量嗎?如果是這樣,請合法重命名。如果是字符串,請正確引用它。 – alistaire

+0

Alistaire - 我試過「引號」引號和引號我這個例子都有相同的結果 –

+0

你確定你不應該發送json嗎? – hadley

回答

0

我以爲我可能錯過了一些愚蠢的東西,而@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)) 
}