Skip to content

Commit 9800d7d

Browse files
authored
Merge pull request #143 from http-rs/query
Request::{set_,}query
2 parents aeb1fb4 + 8edd8df commit 9800d7d

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,
@@ -585,6 +585,63 @@ impl Request {
585585
pub fn ext_mut(&mut self) -> &mut Extensions {
586586
&mut self.ext
587587
}
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+
}
588645
}
589646

590647
impl Clone for Request {

0 commit comments

Comments
 (0)