代码之家  ›  专栏  ›  技术社区  ›  Tom McMahon

Httr标头在数字文本中返回无效字符“-”

  •  1
  • Tom McMahon  · 技术社区  · 9 年前

    我正在使用 httr 访问stockfighter的API,这是一个CTF风格的交易游戏。

    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"
    

    我觉得这可能是一个非常愚蠢的简单错误,但我无法解决。

    编辑:

    下面是使用的python方法 requests json 这非常有效。

    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}
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Tom McMahon    9 年前

    我想我可能错过了一些愚蠢的东西,正如@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))
    }