request.rs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //! HTTP request builder
  2. use serde::de::DeserializeOwned;
  3. use serde::Serialize;
  4. use crate::error::HttpError;
  5. use crate::response::{RawResponse, Response};
  6. /// HTTP request builder for complex requests
  7. #[derive(Debug)]
  8. pub struct RequestBuilder {
  9. inner: reqwest::RequestBuilder,
  10. }
  11. impl RequestBuilder {
  12. /// Create a new RequestBuilder from a reqwest::RequestBuilder
  13. pub(crate) fn new(inner: reqwest::RequestBuilder) -> Self {
  14. Self { inner }
  15. }
  16. /// Add a header to the request
  17. pub fn header(self, key: impl AsRef<str>, value: impl AsRef<str>) -> Self {
  18. Self {
  19. inner: self.inner.header(key.as_ref(), value.as_ref()),
  20. }
  21. }
  22. /// Set the request body as JSON
  23. pub fn json<T: Serialize + ?Sized>(self, body: &T) -> Self {
  24. Self {
  25. inner: self.inner.json(body),
  26. }
  27. }
  28. /// Set the request body as form data
  29. pub fn form<T: Serialize + ?Sized>(self, body: &T) -> Self {
  30. Self {
  31. inner: self.inner.form(body),
  32. }
  33. }
  34. /// Send the request and return a raw response
  35. pub async fn send(self) -> Response<RawResponse> {
  36. let response = self.inner.send().await?;
  37. Ok(RawResponse::new(response))
  38. }
  39. /// Send the request and deserialize the response as JSON
  40. pub async fn send_json<R: DeserializeOwned>(self) -> Response<R> {
  41. let response = self.inner.send().await?;
  42. let status = response.status();
  43. if !status.is_success() {
  44. let message = response.text().await.unwrap_or_default();
  45. return Err(HttpError::Status {
  46. status: status.as_u16(),
  47. message,
  48. });
  49. }
  50. response.json().await.map_err(HttpError::from)
  51. }
  52. }