如何解决使用 haskell 服务客户端:如何将记录类型编码到正文中作为 FormUrlEncoded
我正在尝试将 Lucsanszky 的 Haskell Binance API 包装器更新为最新的仆人,但似乎发生了一些变化。它位于 https://github.com/adrianmay/haskell-binance
代码想把一些参数作为查询字符串放入请求体中,但是失败的时候看到body为空:
FailureResponse (Request {
requestPath = (BaseUrl {
baseUrlScheme = Https,baseUrlHost = "api.binance.com",baseUrlPort = 443,baseUrlPath = ""},"/api/v3/order/test"),requestQueryString = fromList [("signature",Just "7ffc3cc465737fb4349f06907fc200ffc5e4cc877c69188ef0827a23d5dd9077")],requestBody = Just ((),application/x-www-form-urlencoded),requestAccept = fromList [application/json;charset=utf-8,application/json],requestHeaders = fromList [("X-MBX-APIKEY","...")]),requestHttpVersion = HTTP/1.1,requestMethod = "POST"}
(Response {
responseStatusCode = Status {statusCode = 400,statusMessage = "Bad Request"},responseHeaders = fromList [("Content-Typ...
但我知道我尝试编码的类型可以将自身变成查询字符串:
data TradeParams = TradeParams
{ _symbol :: !Text,_side :: !Side,_type :: !OrderType,_timeInForce :: Maybe Text,_quantity :: Maybe Double,_quoteOrderQty :: Maybe Double,_price :: Maybe Double,_newClientOrderId :: Maybe Text,_stopPrice :: Maybe Double,_icebergQty :: Maybe Double,_newOrderRespType :: Maybe Response,_recvWindow :: Maybe Integer,_timestamp :: !Integer
} deriving (Eq,Show,Generic)
instance ToForm TradeParams where
toForm = genericToForm opts
where
opts = FormOptions {fieldLabelModifier = drop 1}
instance FromForm TradeParams
aTradeParams :: Integer -> H.TradeParams
aTradeParams t = H.TradeParams
{ H._symbol = "ADAGBP",H._side = H.BUY,H._type = H.MARKET,H._quantity = nothing,H._quoteOrderQty = Just 1,H._timestamp = t,H._timeInForce = nothing,H._price = nothing,H._newClientOrderId = nothing,H._stopPrice = nothing,H._icebergQty = nothing,H._newOrderRespType = nothing,H._recvWindow = nothing
}
hspec $ do
describe "All tests" $ do
it "To and from form" $
P.urlEncodeAsForm (aTradeParams 1) `shouldBe` "symbol=ADAGBP"eOrderQty=1.0&type=MARKET&side=BUY×tamp=1"
我认为这些是相关的代码:
type BinanceAccountApi
= "api" :> "v3" :>
( BinanceAccountApiTime
:<|> BinanceAccountApiAllOrders
:<|> BinanceAccountApiTestOrder
)
type BinanceAccountApiTestOrder =
Header "X-MBX-APIKEY" Text :>
"order" :>
"test" :>
ReqBody '[FormUrlEncoded] TradeParams :>
QueryParam "signature" Text :>
Post '[ JSON] Object
testOrder' ::
Maybe Text
-> TradeParams
-> Maybe Text
-> ClientM Object
getServerTime' :<|> allOrders' :<|> testOrder' = client binanceProxy
testOrder ::
TradeParams
-> BinanceUserApi (Either ClientError Object)
testOrder params = do
url <- asks url
man <- asks managr
pub <- asks publicKey
let msg = urlEncodeAsForm params
sig <- sign $ toStrict msg
liftIO $
runclientM
(testOrder'
(Just pub)
params -- I proved this was populated with a trace
(Just ((pack . show) sig))) $
ClientEnv man url nothing defaultMakeClientRequest
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。