tin_nacos_wrapper/
remote.rs1use crate::client::NacosClient;
2use crate::error::{Error, Result};
3use crate::http::HttpClient;
4use serde::de::DeserializeOwned;
5use std::collections::HashMap;
6
7pub struct RemoteServiceClient;
9
10impl RemoteServiceClient {
11 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 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 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}