@@ -7,7 +7,7 @@ use std::ops::Index;
7
7
use std:: pin:: Pin ;
8
8
use std:: task:: { Context , Poll } ;
9
9
10
- use crate :: convert:: DeserializeOwned ;
10
+ use crate :: convert:: { DeserializeOwned , Serialize } ;
11
11
use crate :: headers:: {
12
12
self , HeaderName , HeaderValue , HeaderValues , Headers , Names , ToHeaderValues , Values ,
13
13
CONTENT_TYPE ,
@@ -585,6 +585,63 @@ impl Request {
585
585
pub fn ext_mut ( & mut self ) -> & mut Extensions {
586
586
& mut self . ext
587
587
}
588
+
589
+ /// Get the URL querystring.
590
+ ///
591
+ /// # Examples
592
+ ///
593
+ /// ```no_run
594
+ /// # #[async_std::main]
595
+ /// # async fn main() -> http_types::Result<()> {
596
+ /// use http_types::{Url, Method, Request};
597
+ /// use http_types::convert::{Serialize, Deserialize};
598
+ ///
599
+ /// #[derive(Serialize, Deserialize)]
600
+ /// struct Index {
601
+ /// page: u32
602
+ /// }
603
+ ///
604
+ /// let req = Request::new(Method::Get, Url::parse("https://httpbin.org/get?page=2").unwrap());
605
+ /// let Index { page } = req.query()?;
606
+ /// assert_eq!(page, 2);
607
+ /// # Ok(()) }
608
+ /// ```
609
+ pub fn query < T : serde:: de:: DeserializeOwned > ( & self ) -> crate :: Result < T > {
610
+ use std:: io:: { Error , ErrorKind } ;
611
+ let query = self
612
+ . url
613
+ . query ( )
614
+ . ok_or_else ( || Error :: from ( ErrorKind :: InvalidData ) ) ?;
615
+ Ok ( serde_urlencoded:: from_str ( query) ?)
616
+ }
617
+
618
+ /// Set the URL querystring.
619
+ ///
620
+ /// # Examples
621
+ ///
622
+ /// ```no_run
623
+ /// # #[async_std::main]
624
+ /// # async fn main() -> http_types::Result<()> {
625
+ /// use http_types::{Url, Method, Request};
626
+ /// use http_types::convert::{Serialize, Deserialize};
627
+ ///
628
+ /// #[derive(Serialize, Deserialize)]
629
+ /// struct Index {
630
+ /// page: u32
631
+ /// }
632
+ ///
633
+ /// let query = Index { page: 2 };
634
+ /// let mut req = Request::new(Method::Get, Url::parse("https://httpbin.org/get?page=2").unwrap());
635
+ /// req.set_query(&query)?;
636
+ /// assert_eq!(req.url().query(), Some("page=2"));
637
+ /// assert_eq!(req.url().as_str(), "https://httpbin.org/get?page=2");
638
+ /// # Ok(()) }
639
+ /// ```
640
+ pub fn set_query ( & mut self , query : & ( impl Serialize + ?Sized ) ) -> crate :: Result < ( ) > {
641
+ let query = serde_urlencoded:: to_string ( query) ?;
642
+ self . url . set_query ( Some ( & query) ) ;
643
+ Ok ( ( ) )
644
+ }
588
645
}
589
646
590
647
impl Clone for Request {
0 commit comments