Skip to main content

cdk_http_client/
request.rs

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