java_client.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import httpx
  2. from typing import Optional
  3. from app.config import settings
  4. import logging
  5. logger = logging.getLogger(__name__)
  6. class JavaClient:
  7. """Java 后端 HTTP 客户端 (所有 Python→Java 通信的单一入口)"""
  8. def __init__(self):
  9. self.base_url = settings.java_base_url
  10. self._client: Optional[httpx.AsyncClient] = None
  11. async def _get_client(self) -> httpx.AsyncClient:
  12. if self._client is None:
  13. self._client = httpx.AsyncClient(
  14. base_url=self.base_url,
  15. timeout=httpx.Timeout(10.0, connect=3.0),
  16. )
  17. return self._client
  18. async def close(self):
  19. if self._client:
  20. await self._client.aclose()
  21. self._client = None
  22. async def get_published_articles(self) -> list[dict]:
  23. """获取已发布的文章列表 (用于构建知识库)"""
  24. client = await self._get_client()
  25. resp = await client.post("/api/article/list", json={"status": "published", "limit": 1000})
  26. data = resp.json()
  27. if data.get("code") == 200:
  28. return data.get("data", [])
  29. return []
  30. async def search_products(self, keyword: str, limit: int = 5) -> list[dict]:
  31. """按关键词搜索上架商品"""
  32. client = await self._get_client()
  33. resp = await client.post("/api/product/search", json={
  34. "keyword": keyword, "status": "上架", "limit": limit
  35. })
  36. data = resp.json()
  37. if data.get("code") == 200:
  38. return data.get("data", [])
  39. return []
  40. async def search_activities(self, keyword: str, limit: int = 5) -> list[dict]:
  41. """按关键词搜索进行中的活动"""
  42. client = await self._get_client()
  43. resp = await client.post("/api/activity/search", json={
  44. "keyword": keyword, "status": "published", "limit": limit
  45. })
  46. data = resp.json()
  47. if data.get("code") == 200:
  48. return data.get("data", [])
  49. return []
  50. async def search_articles(self, keyword: str, limit: int = 5) -> list[dict]:
  51. """按关键词搜索已发布文章"""
  52. client = await self._get_client()
  53. resp = await client.post("/api/article/search", json={
  54. "keyword": keyword, "status": "published", "limit": limit
  55. })
  56. data = resp.json()
  57. if data.get("code") == 200:
  58. return data.get("data", [])
  59. return []
  60. async def get_user_context(self, user_id: int, params: Optional[dict] = None) -> dict:
  61. """获取用户上下文 (对应 Java AiContextService)"""
  62. client = await self._get_client()
  63. resp = await client.post(settings.effective_java_context_url, json={
  64. "user_id": str(user_id),
  65. "params": params or {},
  66. })
  67. data = resp.json()
  68. if data.get("code") == 200:
  69. return data.get("data", {})
  70. return {}