Skip to content

Commit c66f051

Browse files
authored
Merge pull request #246 from Fishrock123/requestbuilder-query
RequestBuilder: add .query()
2 parents 0cc038a + a5f337b commit c66f051

File tree

3 files changed

+41
-21
lines changed

3 files changed

+41
-21
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ log = { version = "0.4.7", features = ["kv_unstable"] }
3434
mime_guess = "2.0.3"
3535
serde = "1.0.97"
3636
serde_json = "1.0.40"
37-
serde_urlencoded = "0.6.1"
3837
url = "2.0.0"
3938
http-client = { version = "6.0.0", default-features = false }
4039
http-types = "2.0.0"

src/request.rs

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::http::{
22
self,
33
headers::{self, HeaderName, HeaderValues, ToHeaderValues},
4-
Body, Error, Method, Mime,
4+
Body, Method, Mime,
55
};
66
use crate::RequestBuilder;
77

@@ -89,14 +89,8 @@ impl Request {
8989
/// assert_eq!(page, 2);
9090
/// # Ok(()) }
9191
/// ```
92-
pub fn query<T: serde::de::DeserializeOwned>(&self) -> Result<T, Error> {
93-
use std::io::{Error, ErrorKind};
94-
let query = self
95-
.req
96-
.url()
97-
.query()
98-
.ok_or_else(|| Error::from(ErrorKind::InvalidData))?;
99-
Ok(serde_urlencoded::from_str(query)?)
92+
pub fn query<T: serde::de::DeserializeOwned>(&self) -> crate::Result<T> {
93+
self.req.query()
10094
}
10195

10296
/// Set the URL querystring.
@@ -119,16 +113,8 @@ impl Request {
119113
/// assert_eq!(req.as_ref().url().as_str(), "https://httpbin.org/get?page=2");
120114
/// # Ok(()) }
121115
/// ```
122-
pub fn set_query(
123-
&mut self,
124-
query: &(impl Serialize + ?Sized),
125-
) -> Result<(), serde_urlencoded::ser::Error> {
126-
let query = serde_urlencoded::to_string(query)?;
127-
self.req.url_mut().set_query(Some(&query));
128-
129-
*self.req.url_mut() = self.req.url().clone();
130-
131-
Ok(())
116+
pub fn set_query(&mut self, query: &impl Serialize) -> crate::Result<()> {
117+
self.req.set_query(query)
132118
}
133119

134120
/// Get an HTTP header.

src/request_builder.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ use crate::http::{
22
headers::{HeaderName, ToHeaderValues},
33
Body, Method, Mime,
44
};
5-
use crate::{Client, Request, Response, Result};
5+
use crate::{Client, Error, Request, Response, Result};
66

77
use futures_util::future::BoxFuture;
8+
use serde::Serialize;
89
use url::Url;
910

1011
use std::fmt;
@@ -94,6 +95,9 @@ impl RequestBuilder {
9495
}
9596

9697
/// Sets a header on the request.
98+
///
99+
/// # Examples
100+
///
97101
/// ```
98102
/// let req = surf::get("https://httpbin.org/get").header("header-name", "header-value").build();
99103
/// assert_eq!(req["header-name"], "header-value");
@@ -104,6 +108,9 @@ impl RequestBuilder {
104108
}
105109

106110
/// Sets the Content-Type header on the request.
111+
///
112+
/// # Examples
113+
///
107114
/// ```
108115
/// # use surf::http::mime;
109116
/// let req = surf::post("https://httpbin.org/post").content_type(mime::HTML).build();
@@ -118,6 +125,9 @@ impl RequestBuilder {
118125
}
119126

120127
/// Sets the body of the request.
128+
///
129+
/// # Examples
130+
///
121131
/// ```
122132
/// # #[async_std::main]
123133
/// # async fn main() -> surf::Result<()> {
@@ -132,6 +142,31 @@ impl RequestBuilder {
132142
self
133143
}
134144

145+
/// Set the URL querystring.
146+
///
147+
/// # Examples
148+
///
149+
/// ```no_run
150+
/// # use serde::{Deserialize, Serialize};
151+
/// # #[async_std::main]
152+
/// # async fn main() -> surf::Result<()> {
153+
/// #[derive(Serialize, Deserialize)]
154+
/// struct Index {
155+
/// page: u32
156+
/// }
157+
///
158+
/// let query = Index { page: 2 };
159+
/// let mut req = surf::get("https://httpbin.org/get").query(&query)?.build();
160+
/// assert_eq!(req.url().query(), Some("page=2"));
161+
/// assert_eq!(req.as_ref().url().as_str(), "https://httpbin.org/get?page=2");
162+
/// # Ok(()) }
163+
/// ```
164+
pub fn query(mut self, query: &impl Serialize) -> std::result::Result<Self, Error> {
165+
self.req.as_mut().unwrap().set_query(query)?;
166+
167+
Ok(self)
168+
}
169+
135170
/// Submit the request and get the response body as bytes.
136171
///
137172
/// # Examples

0 commit comments

Comments
 (0)