tin_nacos_wrapper/
remote.rs

1use crate::client::NacosClient;
2use crate::error::{Error, Result};
3use crate::http::HttpClient;
4use serde::de::DeserializeOwned;
5use std::collections::HashMap;
6
7/// 远程服务调用工具类
8pub struct RemoteServiceClient;
9
10impl RemoteServiceClient {
11    /// 获取服务地址
12    pub async fn get_service_address(
13        nacos_client: &NacosClient,
14        service_name: &str,
15    ) -> Result<String> {
16        let client = nacos_client
17            .get_naming_service()
18            .select_one_healthy_instance(service_name.into(), None, vec![], false)
19            .await
20            .map_err(Error::Nacos)?;
21
22        Ok(client.ip_and_port())
23    }
24
25    /// 发送POST请求并处理响应
26    pub async fn post_with_response<T>(
27        url: &str,
28        json_body: &serde_json::Value,
29        headers: Option<HashMap<String, String>>,
30    ) -> Result<T>
31    where
32        T: DeserializeOwned,
33    {
34        let response = HttpClient::new()
35            .post(url, json_body, headers)
36            .await
37            .map_err(Error::Request)?;
38
39        let status = response.status();
40        if !status.is_success() {
41            return Err(Error::Service(format!(
42                "Request failed with status: {status}"
43            )));
44        }
45
46        let text = response.text().await.map_err(|e| {
47            log::error!("读取响应文本失败: {e}");
48            Error::Request(e)
49        })?;
50        log::debug!("响应文本: {text}");
51
52        let api_resp = serde_json::from_str::<T>(&text).map_err(|e| {
53            log::error!("反序列化失败: {e}");
54            Error::Json(e)
55        })?;
56
57        Ok(api_resp)
58    }
59
60    /// 发送GET请求并处理响应
61    pub async fn get_with_response<T>(
62        url: &str,
63        headers: Option<HashMap<String, String>>,
64    ) -> Result<T>
65    where
66        T: DeserializeOwned,
67    {
68        log::debug!("发送GET请求到: {url},headers: {headers:?}");
69
70        let response = HttpClient::new()
71            .get(url, headers)
72            .await
73            .map_err(Error::Request)?;
74
75        let status = response.status();
76        if !status.is_success() {
77            return Err(Error::Service(format!(
78                "Request failed with status: {status}"
79            )));
80        }
81
82        let text = response.text().await.map_err(|e| {
83            log::error!("读取响应文本失败: {e}");
84            Error::Request(e)
85        })?;
86        log::debug!("响应文本: {text}");
87
88        let api_resp = serde_json::from_str::<T>(&text).map_err(|e| {
89            log::error!("反序列化失败: {e}");
90            Error::Json(e)
91        })?;
92
93        Ok(api_resp)
94    }
95}