zabbix_api/client/
post.rs

1use log::{debug, error};
2use reqwest::blocking::Client;
3use serde::Serialize;
4
5use crate::error::ZabbixApiError;
6
7const CONTENT_TYPE_HEADER: &str = "Content-Type";
8const CONTENT_TYPE_JSON: &str = "application/json";
9
10pub fn send_post_request<T: Serialize>(
11    client: &Client,
12    url: &str,
13    session: Option<&str>,
14    request: T,
15) -> Result<String, ZabbixApiError> {
16    debug!("send post request to '{url}'");
17
18    let request_body = serde_json::to_string(&request)?;
19
20    debug!("---[HTTP REQUEST]----");
21    debug!("{}", request_body);
22    debug!("---[/HTTP REQUEST]----");
23
24    let mut http_request_builder = client
25        .post(url)
26        .body(request_body)
27        .header(CONTENT_TYPE_HEADER, CONTENT_TYPE_JSON);
28
29    if let Some(auth_token) = session {
30        #[cfg(feature = "v7")]
31        {
32            // For v7, add token as Bearer auth header
33            http_request_builder = http_request_builder.bearer_auth(auth_token);
34        }
35        // If only v6 feature is enabled (and not v7), token is expected in the JSON body
36        // (handled by ZabbixApiRequest<T> for v6) and not as a Bearer token.
37    }
38
39    let response = http_request_builder.send()?;
40
41    let response_status = response.status();
42    let response_text = response.text()?;
43
44    debug!("---[HTTP RESPONSE]----");
45    debug!("{}", response_text);
46    debug!("---[/HTTP RESPONSE]----");
47
48    if response_status == reqwest::StatusCode::OK {
49        Ok(response_text)
50    } else {
51        error!("unexpected server response code {}", response_status);
52        Err(ZabbixApiError::BadRequestError)
53    }
54}