Skip to content

Commit 8edd8df

Browse files
committed
Request::{set_,}query
1 parent 5467861 commit 8edd8df

File tree

1 file changed

+58
-1
lines changed

1 file changed

+58
-1
lines changed

src/request.rs

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::ops::Index;
77
use std::pin::Pin;
88
use std::task::{Context, Poll};
99

10-
use crate::convert::DeserializeOwned;
10+
use crate::convert::{DeserializeOwned, Serialize};
1111
use crate::headers::{
1212
self, HeaderName, HeaderValue, HeaderValues, Headers, Names, ToHeaderValues, Values,
1313
CONTENT_TYPE,
@@ -589,6 +589,63 @@ impl Request {
589589
pub fn ext_mut(&mut self) -> &mut Extensions {
590590
&mut self.ext
591591
}
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+
}
592649
}
593650

594651
impl Clone for Request {

0 commit comments

Comments
 (0)