serde-rs / serde

Serialization framework for Rust
https://serde.rs/
Apache License 2.0
9.02k stars 761 forks source link

Pls help check the issue of "Error: error decoding response body: data did not match any variant of untagged enum HuobiResponse" #1845

Closed foonsun closed 4 years ago

foonsun commented 4 years ago

My project is here: https://github.com/foonsun/huobi_future_async

Enum Example:https://github.com/foonsun/binance-async-rs/blob/master/src/error.rs#L27

JSON Example:https://github.com/foonsun/binance-async-rs/blob/master/src/transport.rs#L209

I use the projects above to wirte my codes on huobi. The API address is https://api.hbdm.vn/api/v1/contract_contract_info.

The data return is Json formated.

I have tried to fix it for one week.But still I don't know the reason failed.

Pls help me.

Below is my code.My code is copied from https://github.com/foonsun/binance-async-rs/.

#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct HuobiErrorData {
    pub code: i64,
    pub msg: String,
}

#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(untagged)]
pub enum HuobiResponse<T> {
    Success(T),
    Error(HuobiErrorData),
}

impl<T: for<'a> Deserialize<'a>> HuobiResponse<T> {
    pub fn into_result(self) -> Result<T, Error> {
        match self {
            Self::Success(t) => Result::Ok(t),
            Self::Error(HuobiErrorData { code, msg }) => {
                Result::Err(Error::HuobiError { code, msg })
            }
        }
    }
}

The origin response of the api is below.

{"status":"ok","data":[{"symbol":"BTC","contract_code":"BTC200703","contract_type":"this_week","contract_size":100.000000000000000000,"price_tick":0.010000000000000000,"delivery_date":"20200703","create_date":"20200619","contract_status":1},{"symbol":"BTC","contract_code":"BTC200710","contract_type":"next_week","contract_size":100.000000000000000000,"price_tick":0.010000000000000000,"delivery_date":"20200710","create_date":"20200626","contract_status":1},{"symbol":"BTC","contract_code":"BTC200925","contract_type":"quarter","contract_size":100.000000000000000000,"price_tick":0.010000000000000000,"delivery_date":"20200925","create_date":"20200612","contract_status":1},{"symbol":"BTC","contract_code":"BTC201225","contract_type":"next_quarter","contract_size":100.000000000000000000,"price_tick":0.010000000000000000,"delivery_date":"20201225","create_date":"20200605","contract_status":1},{"symbol":"ETH","contract_code":"ETH200703","contract_type":"this_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200703","create_date":"20200619","contract_status":1},{"symbol":"ETH","contract_code":"ETH200710","contract_type":"next_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200710","create_date":"20200626","contract_status":1},{"symbol":"ETH","contract_code":"ETH200925","contract_type":"quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200925","create_date":"20200612","contract_status":1},{"symbol":"ETH","contract_code":"ETH201225","contract_type":"next_quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20201225","create_date":"20200605","contract_status":1},{"symbol":"EOS","contract_code":"EOS200703","contract_type":"this_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200703","create_date":"20200619","contract_status":1},{"symbol":"EOS","contract_code":"EOS200710","contract_type":"next_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200710","create_date":"20200626","contract_status":1},{"symbol":"EOS","contract_code":"EOS200925","contract_type":"quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200925","create_date":"20200612","contract_status":1},{"symbol":"EOS","contract_code":"EOS201225","contract_type":"next_quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20201225","create_date":"20200605","contract_status":1},{"symbol":"BCH","contract_code":"BCH200703","contract_type":"this_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200703","create_date":"20200619","contract_status":1},{"symbol":"BCH","contract_code":"BCH200710","contract_type":"next_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200710","create_date":"20200626","contract_status":1},{"symbol":"BCH","contract_code":"BCH200925","contract_type":"quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200925","create_date":"20200612","contract_status":1},{"symbol":"BCH","contract_code":"BCH201225","contract_type":"next_quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20201225","create_date":"20200605","contract_status":1},{"symbol":"BSV","contract_code":"BSV200703","contract_type":"this_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200703","create_date":"20200619","contract_status":1},{"symbol":"BSV","contract_code":"BSV200710","contract_type":"next_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200710","create_date":"20200626","contract_status":1},{"symbol":"BSV","contract_code":"BSV200925","contract_type":"quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200925","create_date":"20200612","contract_status":1},{"symbol":"BSV","contract_code":"BSV201225","contract_type":"next_quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20201225","create_date":"20200605","contract_status":1},{"symbol":"LTC","contract_code":"LTC200703","contract_type":"this_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200703","create_date":"20200619","contract_status":1},{"symbol":"LTC","contract_code":"LTC200710","contract_type":"next_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200710","create_date":"20200626","contract_status":1},{"symbol":"LTC","contract_code":"LTC200925","contract_type":"quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200925","create_date":"20200612","contract_status":1},{"symbol":"LTC","contract_code":"LTC201225","contract_type":"next_quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20201225","create_date":"20200605","contract_status":1},{"symbol":"XRP","contract_code":"XRP200703","contract_type":"this_week","contract_size":10.000000000000000000,"price_tick":0.000100000000000000,"delivery_date":"20200703","create_date":"20200619","contract_status":1},{"symbol":"XRP","contract_code":"XRP200710","contract_type":"next_week","contract_size":10.000000000000000000,"price_tick":0.000100000000000000,"delivery_date":"20200710","create_date":"20200626","contract_status":1},{"symbol":"XRP","contract_code":"XRP200925","contract_type":"quarter","contract_size":10.000000000000000000,"price_tick":0.000100000000000000,"delivery_date":"20200925","create_date":"20200612","contract_status":1},{"symbol":"XRP","contract_code":"XRP201225","contract_type":"next_quarter","contract_size":10.000000000000000000,"price_tick":0.000100000000000000,"delivery_date":"20201225","create_date":"20200605","contract_status":1},{"symbol":"ETC","contract_code":"ETC200703","contract_type":"this_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200703","create_date":"20200619","contract_status":1},{"symbol":"ETC","contract_code":"ETC200710","contract_type":"next_week","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200710","create_date":"20200626","contract_status":1},{"symbol":"ETC","contract_code":"ETC200925","contract_type":"quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20200925","create_date":"20200612","contract_status":1},{"symbol":"ETC","contract_code":"ETC201225","contract_type":"next_quarter","contract_size":10.000000000000000000,"price_tick":0.001000000000000000,"delivery_date":"20201225","create_date":"20200605","contract_status":1},{"symbol":"TRX","contract_code":"TRX200703","contract_type":"this_week","contract_size":10.000000000000000000,"price_tick":0.000010000000000000,"delivery_date":"20200703","create_date":"20200619","contract_status":1},{"symbol":"TRX","contract_code":"TRX200710","contract_type":"next_week","contract_size":10.000000000000000000,"price_tick":0.000010000000000000,"delivery_date":"20200710","create_date":"20200626","contract_status":1},{"symbol":"TRX","contract_code":"TRX200925","contract_type":"quarter","contract_size":10.000000000000000000,"price_tick":0.000010000000000000,"delivery_date":"20200925","create_date":"20200612","contract_status":1},{"symbol":"TRX","contract_code":"TRX201225","contract_type":"next_quarter","contract_size":10.000000000000000000,"price_tick":0.000010000000000000,"delivery_date":"20201225","create_date":"20200605","contract_status":1}],"ts":1593233943882}

The logs are below.

Jun 21 20:46:28.822 TRACE hyper::client::pool: checkout waiting for idle connection: ("https", api.hbdm.vn)    
Jun 21 20:46:28.823 DEBUG reqwest::connect: starting new connection: https://api.hbdm.vn/    
Jun 21 20:46:28.823 TRACE hyper::client::connect::http: Http::connect; scheme=Some("https"), host=Some("api.hbdm.vn"), port=None    
Jun 21 20:46:28.823 DEBUG hyper::client::connect::dns: resolving host="api.hbdm.vn"    
Jun 21 20:46:28.831 DEBUG hyper::client::connect::http: connecting to 13.224.166.33:443    
Jun 21 20:46:28.897 TRACE mio::poll: registering with poller    
Jun 21 20:46:28.897 TRACE mio::sys::unix::kqueue: registering; token=Token(0); interests=Readable | Writable | Error | Hup    
Jun 21 20:46:30.008 DEBUG hyper::client::connect::http: connected to 13.224.166.33:443    
Jun 21 20:46:30.793 TRACE hyper::client::conn: client handshake HTTP/1    
Jun 21 20:46:30.793 TRACE hyper::client: handshake complete, spawning background dispatcher task    
Jun 21 20:46:30.794 TRACE want: signal: Want    
Jun 21 20:46:30.794 TRACE want: signal found waiting giver, notifying    
Jun 21 20:46:30.794 TRACE hyper::proto::h1::conn: flushed({role=client}): State { reading: Init, writing: Init, keep_alive: Busy }    
Jun 21 20:46:30.794 TRACE want: poll_want: taker wants!    
Jun 21 20:46:30.794 TRACE hyper::client::pool: checkout dropped for ("https", api.hbdm.vn)    
Jun 21 20:46:30.794 TRACE hyper::proto::h1::role: Client::encode method=GET, body=None    
Jun 21 20:46:30.794 TRACE hyper::proto::h1::io: detected no usage of vectored write, flattening    
Jun 21 20:46:30.794 DEBUG hyper::proto::h1::io: flushed 152 bytes    
Jun 21 20:46:30.794 TRACE hyper::proto::h1::conn: flushed({role=client}): State { reading: Init, writing: KeepAlive, keep_alive: Busy }    
Jun 21 20:46:31.054 TRACE hyper::proto::h1::conn: Conn::read_head    
Jun 21 20:46:31.055 TRACE hyper::proto::h1::conn: flushed({role=client}): State { reading: Init, writing: KeepAlive, keep_alive: Busy }    
Jun 21 20:46:31.157 TRACE hyper::proto::h1::conn: Conn::read_head    
Jun 21 20:46:31.157 DEBUG hyper::proto::h1::io: read 8192 bytes    
Jun 21 20:46:31.157 TRACE hyper::proto::h1::role: Response.parse([Header; 100], [u8; 8192])    
Jun 21 20:46:31.157 TRACE hyper::proto::h1::role: Response.parse Complete(617)    
Jun 21 20:46:31.157 DEBUG hyper::proto::h1::io: parsed 18 headers    
Jun 21 20:46:31.157 DEBUG hyper::proto::h1::conn: incoming body is content-length (7868 bytes)    
Jun 21 20:46:31.157 TRACE hyper::proto::h1::decode: decode; state=Length(7868)    
Jun 21 20:46:31.158 TRACE hyper::proto::h1::conn: flushed({role=client}): State { reading: Body(Length(293)), writing: KeepAlive, keep_alive: Busy }    
Jun 21 20:46:31.158 DEBUG reqwest::async_impl::client: response '200 OK' for https://api.hbdm.vn/api/v1/contract_contract_info    
Jun 21 20:46:31.158 TRACE hyper::proto::h1::decode: decode; state=Length(293)    
Jun 21 20:46:31.158 DEBUG hyper::proto::h1::io: read 293 bytes    
Jun 21 20:46:31.158 DEBUG hyper::proto::h1::conn: incoming body completed    
Jun 21 20:46:31.158 TRACE hyper::proto::h1::conn: maybe_notify; read_from_io blocked    
Jun 21 20:46:31.158 TRACE want: signal: Want    
Jun 21 20:46:31.158 TRACE want: signal found waiting giver, notifying    
Jun 21 20:46:31.158 TRACE hyper::proto::h1::conn: flushed({role=client}): State { reading: Init, writing: Init, keep_alive: Idle }    
Jun 21 20:46:31.158 TRACE want: signal: Want    
Jun 21 20:46:31.158 TRACE hyper::proto::h1::conn: flushed({role=client}): State { reading: Init, writing: Init, keep_alive: Idle }    
Jun 21 20:46:31.158 TRACE want: poll_want: taker wants!    
Jun 21 20:46:31.158 TRACE hyper::client::pool: put; add idle connection for ("https", api.hbdm.vn)    
Jun 21 20:46:31.158 DEBUG hyper::client::pool: pooling idle connection for ("https", api.hbdm.vn)    
Jun 21 20:46:31.159 TRACE want: signal: Want    
Jun 21 20:46:31.159 TRACE hyper::proto::h1::conn: flushed({role=client}): State { reading: Init, writing: Init, keep_alive: Idle }    
Error: error decoding response body: data did not match any variant of untagged enum HuobiResponse
Jun 21 20:46:31.159 TRACE hyper::proto::h1::dispatch: client tx closed    
Jun 21 20:46:31.160 TRACE hyper::proto::h1::conn: State::close_read()    
Jun 21 20:46:31.160 TRACE hyper::proto::h1::conn: State::close_write()    
Jun 21 20:46:31.160 TRACE hyper::proto::h1::conn: flushed({role=client}): State { reading: Closed, writing: Closed, keep_alive: Disabled }    
Jun 21 20:46:31.160 TRACE hyper::proto::h1::conn: shut down IO complete    
Jun 21 20:46:31.160 TRACE mio::poll: deregistering handle with poller    
Jun 21 20:46:31.160 TRACE want: signal: Closed
foonsun commented 4 years ago