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